volatile 实现 单例模式】的更多相关文章

单例模式的一种实现方式,但很多人会忽略volatile关键字,因为没有该关键字,程序也可以很好的运行,只不过代码的稳定性总不是100%,说不定在未来的某个时刻,隐藏的bug就出来了. 双重校验锁 class Singleton { private volatile static Singleton instance; private Singleton (){}   public static Singleton getInstance() { if (instance == null) { s…
上一篇中,我们了解了Synchronized关键字,知道了它的基本使用方法,它的同步特性,知道了它与Java内存模型的关系,也明白了Synchronized可以保证"原子性","可见性","有序性".今天我们来看看另外一个关键字Volatile,这也是极其重要的关键字之一.毫不夸张的说,面试的时候谈到Synchronized,必定会谈到Volatile. 一个小栗子 public class Main { private static boole…
Volatile的特征: A.禁止指令重排(有例外)原理: 内存屏障/内存栅栏B.可见性  原理:happens-before 对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的.. Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性,不能保证线程安全 volatile只能保证变量的可见性,无法保证对变量的操作的原子性. Volatile的内存语义: 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变…
Java内存模型是围绕在并发过程中如何处理原子性.可见性.有序性来建立的. 一.主内存与工作内存 Java内存模型主要目标是在虚拟机中将变量存储到内存和从内存中取出变量.这里的变量包括:实例字段.静态字段.构成数组对象的元素:不包括局部变量和方法参数,因为它们是线程私有的.Java内存模型规定了所有变量都存储在主内存,线程的工作内存保存该线程使用的变量的主内存副本拷贝.线程对变量的所有读取.赋值操作在工作内存中进行,不能直接读写主内存中的变量.不同线程之间的变量值传递在主内存中进行.主内存主要对…
第一.java内存模型 共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见. 从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中, 每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本. 本地内存是JMM的一个抽象概念,并不真实存在.它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化. JMM关于同步的规定: 1 线…
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相关知识,接下来将阅读该书,并且进行比较详细的总结,好记性不如烂笔头,加油. Java多线程编程实战指南(核心篇)读书笔记(二),主要记录该书第三章的基本概念等知识,后续部分将会持续更新哦~欢迎关注本博客. 目录: Java多线程编程实战指南(核心篇)读书笔记(一) Java多线程编程实战指南(核心篇…
背景:我们在实现单例模式的时候往往会忽略掉多线程的情况,就是写的代码在单线程的情况下是没问题的,但是一碰到多个线程的时候,由于代码没写好,就会引发很多问题,而且这些问题都是很隐蔽和很难排查的. 例子1:没有volatile修饰的uniqueInstance public class Singleton { private static Singleton uniqueInstance; private Singleton(){ } public static Singleton getInsta…
单例模式是最简单的设计模式,实现也非常"简单".一直以为我写没有问题,直到被 Coverity 打脸. 1. 暴露问题 前段时间,有段代码被 Coverity 警告了,简化一下代码如下,为了方便后面分析,我在这里标上了一些序号: private static SettingsDbHelper sInst = null;public static SettingsDbHelper getInstance(Context context) {if (sInst == null) { //…
双重检验的单例模式是比较推荐的单例写法,在该代码中的单例对象的是用volatile关键字修饰的.这时就产生的一个疑问,为什么需要volatile来修饰呢?上网查看多个博客,下面简单通俗分析一下当中的原因:贴上不加volatile单例代码 public class Singleton {    private static Singleton s;    private Singleton(){};    public static Singleton getInstance() {  //1  …
在之前学习了单例模式在多线程下的设计,疑惑为何要加volatile关键字.加与不加有什么区别呢?这里我们就来研究一下.单例模式的设计可以参考个人总结的这篇文章   背景:在早期的JVM中,synchronized存在巨大的性能开销.因此,有人想出了一个"聪明"的技巧:双重检查锁定(Double-Checked Locking).人们想通过双重检查锁定来降低同步的开销.下面是使用双重检查锁定来实现延迟初始化的示例代码. public class DoubleCheckedLocking…