Java并发机制的底层实现原理(一)
1、volatile的应用
- 定义:volatile是一种轻量级的synchronized锁,它的主要作用就是确保我们的共享变量“可见性”,也就是多线程中,当一个线程对共享变量的值进行了修改,这种变化也能够让其它线程清晰的知道。
也就是说,在volatile修饰下,能够确保共享变量得到准确和统一的更新,线程应该通过排它锁来单独获取这个变量。
底层原理
- 在有该修饰的变量代码中,其转汇编代码后,存在以Lock前缀添加的操作。
//形如
lock add 00;
- 这样的操作,使其多处理器中出现了以下两种情况:
一、使当前缓存器缓存的内容写回至内存
二、上面的写回的操作,使其它CPU缓存的该内存地址的数据无效
娓娓道来
- 1)Lock前缀指令会引起处理器缓存写回到内存:
1、用通俗易懂的话解释就是,我们在底层的数据操作中,使用了lock锁对数据的限制。我们的处理器有cache(缓存器),这个是为了中间协调我们的内存和CPU处理速度差距太大的情况,而设计的一种处理器模式。我们在数据操作中,并不会频繁的调用内存的数据,而是先在cache中寻找。
2、这种寻找就会延伸出如:缓存命中(也就是在缓存中找到了我们需要读取的值)、写命中(写的操作数在缓存中找到)以及其它种种。
3、一个线程对共享变量进行修改时,在下一个变量得到锁,进行下一步修改之前,因为volatile的优化,会使我们线程修改的变量被立即写入内存中,而不是放在缓存中,就释放锁。
- 2)缓存写到内存会导致其它处理器的缓存无效:
这里的形容就比较抽象,我们的多处理器,或者多线程在对共享变量进行操作时,都会有一个叫做嗅探的东西来检测我们的其它处理器变化,并起到很大的作用,比如。上述的一个线程在将共享变量写回到内存后,其它处理器中储存的该内存地址的数据就会失效,失去它的作用。
volatile的优化
- 使用一个叫做linkedTransferQueue的队列集合类来在缓存中追加字节,这样的追加可以用下面的图来解释:
- 上图就是追加64字节的一种优化速度的方法。
- 当然,并不是只要追加到64字节就会提高性能,假如缓存的宽是32位。又或者我们不会频繁对其进行调用。这样追加的方式并不会提高性能。
- 以上是本次的小总结!
!心感想:也算是选择了这条路,既然选择了,咱们就去拼去闯。