A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 武汉-就业部 于 2017-7-28 09:59 编辑

单例设计模式

近期接触到一个电子市场的项目, 在处理线程池的时候,使用到单例设计模式。这本身是一个很简单的问题,但是使用到很少见的双重检查枷锁模式。因此,特地把单例设计模式重新梳理一下。
1. 懒汉式

特点: 声明一个私有的成员对象,并且赋值null。通过一个对外暴露的方法返回我们需要的对象,该方法进行了加锁,并且对该对象进行了非null判断。


public class SingletonClass{
    private static SingletonClass instance=null;
    public static synchronized SingletonClass getInstance(){
        if(instance==null){
          instance=new SingletonClass();
        }
        return instance;
    }
    private SingletonClass(){
    }
}

2. 饿汉式

特点:声明一个私有的静态成员对象,并且进行初始化。通过创建一个公共的可以访问的public 方法,返回该对象。
public class Singleton{


    //在自己内部定义自己的一个实例,只供内部调用
    private static final Singleton instance = new Singleton();
    private Singleton(){
        //do something
    }
    //这里提供了一个供外部访问本class的静态方法,可以直接访问
    public static Singleton getInstance(){
        return instance;
    }
}


3. 双重检查加锁式
这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
这种模式中双重判断加同步的方式,效率大大提升,因为如果单层if判断,在服务器允许的情况下,假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。

public class Singleton{
    private static volatile Singleton instance=null;
    private Singleton(){
        //do something
    }
    public static  Singleton getInstance(){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
     }
}

双重加锁 对比  懒汉式的区别:

懒汉式, 每一次实例化都要启用同步机制, 比较耗费资源.
而双重加锁机制, 只在第一次实例化的时候,启动同步机制.

1 个回复

倒序浏览
厉害了~~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马