本帖最后由 武汉-就业部 于 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; } }
双重加锁 对比 懒汉式的区别:
懒汉式, 每一次实例化都要启用同步机制, 比较耗费资源. 而双重加锁机制, 只在第一次实例化的时候,启动同步机制.
|