package test;/** * 双重检查锁实现单例类 * @author huawangxin * 2017年2月16日 下午2:28:27 * * 代码会检查两次单例类是否有已存在的实例,一次加锁一次不加锁,一次确保不会有多个实例被创建。 * 该模型存在的问题: * 解决方案:在JDK1.5中,java修复了其内存模型的问题。volatile修饰符修饰object变量, * 能保证先行发生关系,所有的写(write)都将先行发生于读(read)。在JDK1.5之前,这种方法会有问题。 * */public class TestSingleton { PRivate static TestSingleton object; public static TestSingleton getInstance() { if (object == null) { synchronized (object) { if (object == null) { object = new TestSingleton(); } } } return object; }}
package test;/** * 双重检查锁实现单例类【改进版】 * @author huawangxin * 2017年2月16日 下午2:28:27 * */public class TestSingleton2 { private static TestSingleton2 instance = null; private TestSingleton2() {} private static synchronized void syncInit() { if (instance == null) { instance = new TestSingleton2(); } } public static TestSingleton2 getInstance() { if (instance == null) { syncInit(); } return instance; }}
package test;/** * 枚举实现单例类【改进二版】 * @author huawangxin * 2017年2月16日 下午2:28:27 * 该方式为目前最好的原因:1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击 * */public enum Work { INSTANCE; public TestSingleton singleWrite() { return new TestSingleton(); }
private Object readResolve(){ return INSTANCE; }}public class Test{ public static void main(String[] args) { TestSingleton write = Work.INSTANCE.singleWrite(); }}
新闻热点
疑难解答