// 创建单例模式(懒汉)
class Singleton{private Singleton(){}private static volatile Singleton INSTANCE = null;public static Singleton getINSTANCE(){if (INSTANCE == null){synchronized (Singleton.class){if (INSTANCE == null){return new Singleton();}}}return INSTANCE;}
}

1、为什么要检查两次?
如果只检查synchronized代码块里那一次,每次调用getInstance方法的时候都会进入一次synchronized代码块,效率不高。synchronized代码块只为了保护第一次创建实例的时候不被重复创建,当实例已经创建完成之后就不需要同步代码块的保护了。
所以一个好的做法是,再检查一次,在instance被创建好之后就直接跳过同步代码块直接返回实例对象了。
2、为什么instance对象必须加volatile关键字
原因涉及到Java底层的指令重排问题,可能导致多线程情况下返回一个未被完全初始化的instance,所以应该加volatile关键字防止指令重排。

【Java并发】double-checked-locking设计模式相关推荐

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

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

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

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

  3. 双重检查锁Double Checked Locking Pattern的非原子操作下的危险性

    Double Checked Locking Pattern 即双重检查锁模式. 双重检查锁模式是一种软件设计模式,用于减少获取锁的开销.程序首先检查锁定条件,并且仅当检查表明需要锁时才才获取锁. 延 ...

  4. 单例模式,懒汉饿汉,线程安全,double checked locking的问题

    概览 本文目的 单例 饿汉模式 懒汉模式 线程安全的Singleton实现 懒汉普通加锁 double checked locking double checked locking 靠不住? 静态局部 ...

  5. Java并发编程(五)JVM指令重排

    我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果.. ...

  6. Java并发编程实战基础概要

    文章目录 Java并发编程实战基础概要 开篇 多线程问题有啥难点呢? 为啥要学习并发编程? 并发问题的根源是什么? CPU切换线程执导致的原子性问题是如何发生的? 缓存导致的可见性问题是如何发生的? ...

  7. 独特视角带你走进Java并发编程的世界

    独特视角带你走进Java并发编程的世界 全局概括 并发问题产生的三个根本原因 java内存模型: 有序性和可见性的解决方案 volatile关键字 Happens-Before规则 锁: 原子性的解决 ...

  8. 3. Java 并发

    3.1 并发基础 Java 并发 - 理论基础 Java 并发 - 线程基础 多线程的出现是要解决什么问题的? 本质什么? CPU.内存.I/O 设备的速度是有极大差异的,为了合理利用 CPU 的高性 ...

  9. 构建Java并发模型框架

    2002 年 2 月 22 日 Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的 ...

  10. Java 并发编程艺术 读书笔记

    第 1 章 并发编程的挑战 1.1.3 如何减少上下文切换 减少上下文切换的方法有无锁并发编程.CAS 算法.使用最少线程和使用协程. 无锁并发编程.多线程竞争锁时,会引起上下文切换,所以多线程处理数 ...

最新文章

  1. mysql教程or怎么用_MySQL中or语句用法示例
  2. ElementUI的el-cascader级联选择器各个属性的设置
  3. python_魔法方法(二):算术运算
  4. 125 Valid Palindrome
  5. 如何实现公平的效绩考核?
  6. linux cpp建立文件夹,Linux小知识之CMake创建工程的一般流程
  7. 智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析
  8. oracle 丢失msvcr71,安装oracle10G 即时客户端 instant client时msvcr71.dll缺失问题解决
  9. win10时间自动更新错误
  10. 数据分析 - 安然事件
  11. 在Matlab中构建最大带权生成树
  12. QQ群互通(QQ_Bot)程序配置教程
  13. 【电气专业知识问答】问:什么叫组合电器?什么是GIS?
  14. 云服务器如何计算宽带
  15. Resources文件夹
  16. 用Python+ChatGPT
  17. python画简易动物画法_零: python matplotlib 画图进阶(含完整代码)
  18. 惠普笔记本win10系统蓝牙功能突然失效的解决办法
  19. mv命令——移动或重命名文件
  20. JJ斗地主记牌器java开发_【欢乐斗地主记牌器制作】遇到两个问题

热门文章

  1. 【Torch API】pytorch 中torch.ones_like和torch.zeros_like函数详解
  2. ArcToolbox的运行结果发布为GP服务
  3. python延迟实现
  4. 微信小程序+云函数+腾讯云对话机器人API(ChatBot)
  5. Enumerating Trillion Triangles on Distributed Systems
  6. 【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF)
  7. JavaScript断言
  8. Java-web实现用户登录、注册功能
  9. 中国手术标记笔市场趋势报告、技术动态创新及市场预测
  10. 济宁商业学校计算机,济宁商业学校2021年招生录取分数线