一、饿汉式 缺点:不能懒加载 二、懒汉式(线程不安全) 三、懒汉式(线程安全,效率低) 四、懒汉式(线程安全,效率高,但是有空指针异常) 五、懒汉式(解决四的问题,禁止指令重排序,加volatile关键字) 六、内部静态类的更加优雅的方式 ...
分类:
编程语言 时间:
2019-04-22 19:26:31
阅读次数:
140
volatile的作用 1.防止指令重排序 首先要理解什么是指令重排序?指令重排序的利弊?后续举例说明 2.多线程访问共享资源时,缓解synchronized重量级锁带来的性能问题 但是volatile在特定的场景下使用,才能发挥其作用。如果对其原理理解不透彻,使用不当,会带来很多问题。 volat ...
分类:
编程语言 时间:
2019-04-22 13:51:58
阅读次数:
128
https://www.cnblogs.com/chengxiao/p/6528109.html 内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchr ...
分类:
编程语言 时间:
2019-04-08 19:58:21
阅读次数:
187
在多线程并发编程的过程中,执行重排序有时候会造成错误的后果,比如一个线程在main线程中调用setFlag(true)的前边修改了某些程序配置项,而在t1线程里需要用到这些配置项,所以会造成配置缺失的错误。但是java给我们提供了一些抑制指令重排序的方式。 1.同步代码抑制指令重排序 将需要抑制指令 ...
分类:
编程语言 时间:
2019-02-21 00:33:56
阅读次数:
205
目录 1.什么是JMM 2.JMM的主内存和工作内存 3.JMM如何解决可见性问题-指令重排序 4.Volatile 十、JMM(Java内存模型)(暂时没有理解) 1.什么是JMM 2.JMM的主内存和工作内存 (1)主内存 (2)工作内存 (3)主内存和工作内存数据存储类型以及操作方式归纳 (4 ...
分类:
编程语言 时间:
2019-02-11 20:00:02
阅读次数:
213
volatile的作用:1.内存可见性2.禁止指令重排序可见性是指,在多线程环境下,共享变量的操作对于每个线程来说,都是内存可见的,也就是每个线程获取的volatile变量都是最新值;并且每个线程对volatile变量的修改,都直接刷新到主存。下面重点介绍指令重排序。一、为什么要指令重排序为了提高程 ...
分类:
其他好文 时间:
2019-01-27 21:46:13
阅读次数:
186
volatile关键字有两个特性: volatile变量对所有线程的可见性,指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 volatile变量可以禁止指令重排序优化。 因为JVM要求线程每次使用工作内存中的volatile变量时,都必须从主内存中刷新获取最新的值;执行线程每... ...
分类:
其他好文 时间:
2019-01-22 00:37:45
阅读次数:
186
1、volatile的作用 一个线程共享变量(类的成员变量、类的静态成员变量等)被volatile修饰之后,就具有以下作用: 1)并发中的变量可见性(不同线程对该变量进行操作时的可见性),即一个线程修改了某个变量的值,则该新值对其他线程立即可见(可立即访问新值/立即强制写入主存); 2)禁止指令重排 ...
分类:
编程语言 时间:
2019-01-06 19:22:09
阅读次数:
215
所有示例代码,请见/下载于https://github.com/Wasabi1234/concurrency#1基本概念##1.1并发同时拥有两个或者多个线程,如果程序在单核处理器上运行多个线程将交替地换入或者换出内存,这些线程是同时“存在"的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上,此时,程序中的每个线程都将分配到一个处理器核上,因此可以同时运行.##1.2高并发(
分类:
编程语言 时间:
2019-01-01 22:50:42
阅读次数:
217
单例模式有五种写法:懒汉、饿汉、双重检验锁、静态内部类、枚举 懒汉式线程不安全 懒汉式,线程安全 双重检验锁 事实上在 JVM 中这句话大概做了下面 3 件事情。 但是在 JVM 的即时编译器中存在指令重排序的优化。也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也 ...
分类:
编程语言 时间:
2018-11-30 14:00:11
阅读次数:
176