Java单例模式双重检查锁定中volatile关键字的作用
首先要说的是,个人推荐使用饿汉模式和静态内部类方式实现单例模式。其实,静态内部类里也是一个饿汉模式。
懒汉模式中,双重检查锁定代码如下:
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关键字的作用相关推荐
- java高分面试指南:java单例模式双重检查
1. CAP 的由来 要理解 CAP,首先我们要清楚,为何会有人提出 CAP?他提出 CAP 是为了解决什么问题? 时间回到 1985 年,彼时,后来证明了 CAP 理论的 Lynch 教授此时给当时 ...
- java单例模式双重检查
public class Singleton {private static volatile Singleton singleton;private Singleton() {}public sta ...
- java并发编程(二十六)——单例模式的双重检查锁模式为什么必须加 volatile?
前言 本文我们从一个问题出发来进行探究关于volatile的应用. 问题:单例模式的双重检查锁模式为什么必须加 volatile? 什么是单例模式 单例模式指的是,保证一个类只有一个实例,并且提供一个 ...
- java双重检查锁单例真的线程安全吗?
相信大多数同学在面试当中都遇到过手写单例模式的题目,那么如何写一个完美的单例是面试者需要深究的问题,因为一个严谨的单例模式说不定就直接决定了面试结果,今天我们就要来讲讲看似线程安全的双重检查锁单例模 ...
- Java中的双重检查锁(double checked locking)
起因 在实现单例模式时,如果未考虑多线程的情况,很容易写出下面的代码(也不能说是错误的): public class Singleton {private static Singleton uniqu ...
- java 双重检查锁_Java中可怕的双重检查锁定习惯用法
java 双重检查锁 本文讨论的问题不是新问题,但即使是经验丰富的开发人员也仍然很棘手. 单例模式是常见的编程习惯用法. 但是,当与多个线程一起使用时,必须进行某种类型的同步,以免破坏代码. 在相关文 ...
- 双重检查锁与单例模式
单例模式是比较常见的一种设计模式,在开发实践中经常看到它的身影,它有很多种实现方式,曾经有人在一篇文章中列举了十几种实现方式,比如饿汉式.懒汉式.双重检查锁.枚举...等等,程序员应该都熟悉这些常见的 ...
- java 双重检查锁 有序_Java中的双重检查锁(double checked locking)
1 public classSingleton {2 private staticSingleton uniqueSingleton;3 4 privateSingleton() {5 }6 7 pu ...
- 单例模式之双重检查锁(double check locking)的发展历程
不安全的单例 没有注意过多线程安全问题的时候,我们的单例可能是这样的: public final class Singleton {private static Singleton instance; ...
最新文章
- android平台水波效果 源码
- Maven - Dynamic Web Module 3.0 requires Java 1.6 or newer.
- Js:DOM对象操作常用的方法和属性
- JIT编译器杂谈#1:JIT编译器的血缘(一)
- 深入理解javascript原型和闭包(1)——一切都是对象
- pwnable.tw unexploitable 分析
- 捷达vs7测试_捷达VS7——品质硬核!
- python中的列表及注意事项
- python的repl模式_如何更改sublimeREPL默认python版本
- jsp页面struts2标签展示clob类型的数据
- 分类问题-决策树模型
- 国家2000坐标系的理解
- 微信小程序并发服务器架构,「系统架构」如何设计一个健壮高效的微信小程序登录方案...
- excel饼图 将图例放在图中对应位置并显示百分比
- pcie转m2装系统win10_m.2固态硬盘怎么装win10教程|m.2固态硬盘装win10教程步骤
- SQL SERVER性能优化-查询速度提高
- 正确理解差异的“专业意义”与“统计学意义”
- 华为NE5000E集群路由器荣获InfoVision奖
- route指令使用详解
- 【Android】实战图像识别:Compose + MLKit + CameraX
热门文章
- 解决关于 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it....报错
- python—web页面操作之3种等待方式
- 分支定界法上下界_分支定界(Branch-and-Cut)方法的逻辑
- bat脚本+vs2019编译openssl(x86 | x64) - (static | shared) - (debug | release)
- 【开源】WeChatRobot+WeChatHelper 制作自己的微信机器人
- 【GitLab】Gitlab用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner
- 4、使用PreparedStatement接口实现增,删,改操作(常用)
- 寒假每日一题(入门组)【week3 完结】
- 【PAT乙级】1005 继续(3n+1)猜想 (25 分)
- 2.3.1 进程同步 进程互斥