单例模式(双重检测)


I. 前言

给变量加上 volatile 关键字的含义

  • 保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。[相当于一个共享变量]
  • 禁止进行指令重排序。[固定了编译时这条语句的位置]
  • 以上属于个人理解,关于volatile关键字详细说明请参看Matrix海子
    的这篇博客 https://www.cnblogs.com/dolphin0520/p/3920373.html

II. 代码实现

package singleton;

/**
 * 双重检测式
 */
public class SingletonDoubleCheck {

    private static volatile SingletonDoubleCheck instance;

    private SingletonDoubleCheck(){}

    // 对外提供一个静态方法。 仅有在被使用时才创建
    // 加入 synchronized 关键字, 解决线程安全问题
    public static SingletonDoubleCheck getInstance() {
        if (instance == null) {
            synchronized (SingletonDoubleCheck.class){
                if (instance == null) {
                    instance = new SingletonDoubleCheck();
                }
            }
        }

        return instance;
    }
}

III. 优点

  • 使用懒加载模式,避免了不用时的内存浪费
  • 双if 、volatile 及 synchronized 关键字同时保障了线程的安全性和效率问题
  • 实际开发中可用
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容