首先要说的是,个人推荐使用饿汉模式和静态内部类方式实现单例模式。其实,静态内部类里也是一个饿汉模式。
懒汉模式中,双重检查锁定代码如下:

public class Singleton{   // 静态属性,volatile保证可见性和禁止指令重排序private volatile static Singleton instance = null; // 私有化构造器  private Singleton(){}   public static  Singleton getInstance(){   // 第一重检查锁定if(instance==null){  // 同步锁定代码块 synchronized(Singleton.class){// 第二重检查锁定if(instance==null){// 注意:非原子操作instance=new Singleton(); }}              }   return instance;   }
}

volatile作用:以下会涉及到Java内存模型的知识

  • 禁止指令重排序。我们知道new Singleton()是一个非原子操作,编译器可能会重排序【构造函数可能在整个对象初始化完成前执行完毕,即赋值操作(只是在内存中开辟一片存储区域后直接返回内存的引用)在初始化对象前完成】。而线程B在线程A赋值完时判断instance就不为null了,此时B拿到的将是一个没有初始化完成的半成品。

  • 保证可见性。线程A在自己的工作线程内创建了实例,但此时还未同步到主存中;此时线程B在主存中判断instance还是null,那么线程B又将在自己的工作线程中创建一个实例,这样就创建了多个实例。

顺便提一下,volatile禁止指令重排序只能保证volatile修饰的代码之后的代码不会在它之前执行。

Java单例模式双重检查锁定中volatile关键字的作用相关推荐

  1. java高分面试指南:java单例模式双重检查

    1. CAP 的由来 要理解 CAP,首先我们要清楚,为何会有人提出 CAP?他提出 CAP 是为了解决什么问题? 时间回到 1985 年,彼时,后来证明了 CAP 理论的 Lynch 教授此时给当时 ...

  2. java单例模式双重检查

    public class Singleton {private static volatile Singleton singleton;private Singleton() {}public sta ...

  3. java并发编程(二十六)——单例模式的双重检查锁模式为什么必须加 volatile?

    前言 本文我们从一个问题出发来进行探究关于volatile的应用. 问题:单例模式的双重检查锁模式为什么必须加 volatile? 什么是单例模式 单例模式指的是,保证一个类只有一个实例,并且提供一个 ...

  4. java双重检查锁单例真的线程安全吗?

     相信大多数同学在面试当中都遇到过手写单例模式的题目,那么如何写一个完美的单例是面试者需要深究的问题,因为一个严谨的单例模式说不定就直接决定了面试结果,今天我们就要来讲讲看似线程安全的双重检查锁单例模 ...

  5. Java中的双重检查锁(double checked locking)

    起因 在实现单例模式时,如果未考虑多线程的情况,很容易写出下面的代码(也不能说是错误的): public class Singleton {private static Singleton uniqu ...

  6. java 双重检查锁_Java中可怕的双重检查锁定习惯用法

    java 双重检查锁 本文讨论的问题不是新问题,但即使是经验丰富的开发人员也仍然很棘手. 单例模式是常见的编程习惯用法. 但是,当与多个线程一起使用时,必须进行某种类型的同步,以免破坏代码. 在相关文 ...

  7. 双重检查锁与单例模式

    单例模式是比较常见的一种设计模式,在开发实践中经常看到它的身影,它有很多种实现方式,曾经有人在一篇文章中列举了十几种实现方式,比如饿汉式.懒汉式.双重检查锁.枚举...等等,程序员应该都熟悉这些常见的 ...

  8. java 双重检查锁 有序_Java中的双重检查锁(double checked locking)

    1 public classSingleton {2 private staticSingleton uniqueSingleton;3 4 privateSingleton() {5 }6 7 pu ...

  9. 单例模式之双重检查锁(double check locking)的发展历程

    不安全的单例 没有注意过多线程安全问题的时候,我们的单例可能是这样的: public final class Singleton {private static Singleton instance; ...

最新文章

  1. android平台水波效果 源码
  2. Maven - Dynamic Web Module 3.0 requires Java 1.6 or newer.
  3. Js:DOM对象操作常用的方法和属性
  4. JIT编译器杂谈#1:JIT编译器的血缘(一)
  5. 深入理解javascript原型和闭包(1)——一切都是对象
  6. pwnable.tw unexploitable 分析
  7. 捷达vs7测试_捷达VS7——品质硬核!
  8. python中的列表及注意事项
  9. python的repl模式_如何更改sublimeREPL默认python版本
  10. jsp页面struts2标签展示clob类型的数据
  11. 分类问题-决策树模型
  12. 国家2000坐标系的理解
  13. 微信小程序并发服务器架构,「系统架构」如何设计一个健壮高效的微信小程序登录方案...
  14. excel饼图 将图例放在图中对应位置并显示百分比
  15. pcie转m2装系统win10_m.2固态硬盘怎么装win10教程|m.2固态硬盘装win10教程步骤
  16. SQL SERVER性能优化-查询速度提高
  17. 正确理解差异的“专业意义”与“统计学意义”
  18. 华为NE5000E集群路由器荣获InfoVision奖
  19. route指令使用详解
  20. 【Android】实战图像识别:Compose + MLKit + CameraX

热门文章

  1. 解决关于 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it....报错
  2. python—web页面操作之3种等待方式
  3. 分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑
  4. bat脚本+vs2019编译openssl(x86 | x64) - (static | shared) - (debug | release)
  5. 【开源】WeChatRobot+WeChatHelper 制作自己的微信机器人
  6. 【GitLab】Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
  7. 4、使用PreparedStatement接口实现增,删,改操作(常用)
  8. 寒假每日一题(入门组)【week3 完结】
  9. 【PAT乙级】1005 继续(3n+1)猜想 (25 分)
  10. 2.3.1 进程同步 进程互斥