JAVA并发的底层实现

本文深入探讨Java中volatile关键字如何利用lock指令确保多线程环境下的数据一致性。通过介绍volatile的工作原理,揭示不同CPU缓存间如何保持同步,以及JDK7中LinkedTransferQueue的优化策略。

在java的多线程编程中,我们经常会使用一些关键字,如volatile,sychronized,atomic原子操作等等。那么在更加底层的JVM中,这些关键字是怎么实现其对应的效果的呢?

volatile

volatile在多线程编程中,是用于保证共享变量的“可见性”,即不同的线程读到该共享变量时,数据都是一致的。即使修改该变量后,其他的线程也能获取到该更新的值。另外,相对于sychronized,使用volatile更加轻量,因为他不会引起上下文切换和线程调度。
那么volatile是如何在底层实现的呢?
秘密武器就是:lock指令。
lock指令,是汇编指令。在有volatile关键字定义的地方,在经过编译后,在其前面会有lock指令。
该指令的执行,会有两个步骤
1. 将当前缓存数据行的数据写回系统内存
2. 该动作会触发缓存一致性协议,即在其他CPU中缓存的这条数据会失效
这样就保证了在更新了数据之后,其他的CPU也会得到最新的数据,因为他们自己的缓存数据已经被失效了。另外在执行写回内存的操作时,lock不会锁住总线,一般锁缓存,开销会小一点。

优化:在JDK 7中的LinkedTransferQuene中,追加到64字节,使得队列头和队列尾在不同的缓存行,这样锁缓存的时候就不会同时锁住头和尾,达到优化的目的。当然只能在64位上有效。同时在共享变量频繁改写的时候用会比较好。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值