多线程
文章平均质量分 77
码上见高低
纸上得来终觉浅,绝知此事要躬行
展开
-
volatile变量内存可见性的原理分析—汇编指令分析
在java虚拟机的内存模型中,有主内存和工作内存的概念,每个线程对应一个工作内存,并共享主内存的数据,下面看看操作普通变量和volatile变量有什么不同:1、对于普通变量:读操作会优先读取工作内存的数据,如果工作内存中不存在,则从主内存中拷贝一份数据到工作内存中;写操作只会修改工作内存的副本数据,这种情况下,其它线程就无法读取变量的最新值。2、对于volatile变量,读操作时JMM会把工作...转载 2018-10-22 14:52:31 · 1119 阅读 · 3 评论 -
CPU指令重排与缓存一致性
程序中CPU计算+与内存交互(读取,赋值),CPU计算速度远远高于与内存交互的速度(好比内存与查数据库)引入缓存提高速度,缓存一致性是保证数据准确性的硬件协议。指令重排无法逾越内存屏障。缓存一致性的实现,先看看x86的cpu缓存结构。1、各种寄存器,用来存储本地变量和函数参数,访问一次需要1cycle,耗时小于1ns;2、L1 Cache,一级缓存,本地core的缓存,分成32K的数据缓存...原创 2018-10-22 15:08:32 · 2641 阅读 · 0 评论 -
volatile实现内存可见性分析:字节码版本
声明一个volatile变量,并赋值public class VolatileTest { static volatile int i; public static void main(String[] args){ i = 10; }}看看加了volatile之后,编译出来的字节码有什么不同,执行 javap -verbose Volatile...原创 2018-10-22 15:38:50 · 2204 阅读 · 0 评论 -
volatile的使用优化
在jdk7 之后,由于重排序因素,使用该方法作用失效,仅作知识原理学习著名的Java并发编程大师Doug lea在JDK 7的并发包里新增一个队列集合类LinkedTransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。LinkedTransferQueue的代码如下:/** 队列中的头部节点 */private transient fin...原创 2018-10-22 15:49:19 · 899 阅读 · 0 评论