单例模式不简单

来源:互联网 发布:c语言中float的用法 编辑:程序博客网 时间:2024/06/10 02:42
单例模式看似简单,但如果写的不够规范,在高并发下可能会产生严重的堵塞。一般单例的实现有两种方式:

代码一:

public class EagerSingleton{private static final EagerSingleton m_instance = new EagerSingleton();/*** 私有的默认构造子*/private EagerSingleton() { }/*** 静态工厂方法*/public static EagerSingleton getInstance(){}}
这种方式一般没什么问题,第二种方式:
package com.javapatterns.singleton.demos;public class LazySingleton{private static LazySingleton m_instance = null;/*** 私有的默认构造子,保证外界无法直接实例化*/private LazySingleton() { }/*** 静态工厂方法,返还此类的惟一实例*/synchronized public static LazySingleton getInstance(){if (m_instance == null){m_instance = new LazySingleton();}return m_instance;}} 
这种写法确实可以保证在多线程下只能创建一个实例,但如果并发过大,很可能会有大量的堵塞被synchronized,所以实现互斥的最好办法是尽量是互斥的代码的粒度达到最小才行,最好的实现应该是这样:

package com.javapatterns.singleton.demos;public class LazySingleton{private static LazySingleton m_instance = null;/*** 私有的默认构造子,保证外界无法直接实例化*/private LazySingleton() { }/*** 静态工厂方法,返还此类的惟一实例*/public static LazySingleton getInstance(){if (m_instance == null){synchronized(LazySingleton.class){if (m_instance == null)    {     m_instance = new LazySingleton();    }}}  return m_instance; }}