Kata系列之双重检查锁、静态工厂、枚举类实现单例类


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();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值