多线程问的太深入不知道怎么回答,从 volatile 开始给你讲清楚
volatile的用途
1.线程可见性
可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。
**可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。**也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就是这个操作同样存在线程安全问题。
2.防止指令重排序
问题:DCL单例需不需要加volatile?
CPU的基础知识
缓存行对齐缓存行64个字节是CPU同步的基本单位,缓存行隔离会比伪共享效率要高Disruptor
伪共享
合并写CPU内部的4个字节的Buffer
指令重排序
volatile如何解决指令重排序
1: volatile i
2: ACC_VOLATILE
3: JVM的内存屏障
4:hotspot实现
bytecodeinterpreter.cpp
orderaccess_linux_x86.inline.hpp
第一次写这种底层的东西,整理了好几次话术,实在是没整明白该怎么发,因为确实有点难以整理话术,所以这里附上了关键地方的源码以及实例,运行一下可能会更好理解这些技术,后面我会去逐步改进
个人公众号:Java架构师联盟,每日更新技术好文
版权声明: 本文为 InfoQ 作者【小Q】的原创文章。
原文链接:【http://xie.infoq.cn/article/8d8cc3ec8d0ee9be6438d7de8】。
本文遵守【CC BY-NC-ND】协议,转载请保留原文出处及本版权声明。
评论