java中线程安全双重检查单例解析

2020-11-21  本文已影响0人  晏雪峤_美杜莎

实现:
public final class MySingleton {

// 防止指令重排序. (顺序性,可见性), 保证了socket 变量先初始化,instance后赋值。
private volatile static MySingleton instance = null;

private Socket socket;

private MySingleton() {
    this.socket = new Socket();
}

public static MySingleton getInstance() {
    if (null == instance) {
        // 2个线程同时访问时, 只有一个线程可以获取到锁。
        synchronized (MySingleton.class) {
            // 如果不添加判断, 那么第二个线程又重新实例化了一遍,浪费了。
            if (null == instance) {
                // 注意volatile顺序性。
                instance = new MySingleton();
            }
        }
    }
    return instance;
}

}

上一篇 下一篇

猜你喜欢

热点阅读