java关键字volatile原理
所属分类 architecture
浏览量 1368
volatile 保证共享变量的“可见性”,
当另外一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。
它是轻量级的synchronized,不会引起线程上下文的切换和调度,执行开销更小。
volatile修饰的变量在汇编阶段,会多出一条lock前缀指令,在多核处理器下
将当前处理器缓存行的数据写回到系统内存
这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。
处理器和内存之间 多级缓存,处理器先将内存中的数据读取到内部缓存后再进行操作,
因此在一个处理器里修改的变量值,不一定能及时写回缓存,变量修改对其他处理器“不可见”。
使用volatile修饰的变量,在写操作的时候,会强制将这个变量所在缓存行的数据写回到内存中。
另外在多处理器下,为了保证各个处理器的缓存是一致的,会实现缓存一致性协议,
每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期的,
如果过期,就会将该缓存行设置成无效状态,下次使用就会重新从内存中读取。
在某些情况下,通过将共享变量追加到64字节可以优化其使用性能。
JDK 7 并发包,LinkedTransferQueue
队里定义了两个共享结点,头结点和尾结点,都由使用了volatile的内部类定义,通过将两个共享结点的字节数增加到64字节来优化效率
如果队列的头结点和尾结点都不足64字节,处理器会将他们读到同一个高速缓存行,
在多处理器下每个处理器都会缓存同样的头尾结点,当一个处理器试图修改头结点时,会将整个缓存行锁定,
那么在缓存一致性的机制下,其他处理器不能访问自己高速缓存中的尾节点,而头尾结点在队列中都是会频繁访问的,
因此会影响使用性能。而通过填充字节使头尾结点加载到不同的缓存行,避免头尾结点在修改时相互锁定。
volatile是一种“轻量级的锁”,只能保证可见性,但不能保证原子性。
java并发机制的底层实现原理
AtomicInteger源码分析要点
上一篇
下一篇
消息队列知识点
铁娘子董明珠
Redis虚拟槽算法
CMS和G1的区别
关于如何挣钱的35条建议
代理的几种实现方式