Java并发编程的艺术——volatile和synchronized实现原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhc2207221755/article/details/83933275

volatile

volatile变量修饰的共享变量进行写操作时候,会多出lock前缀指令。
lock前缀指令在多核处理器下会引发一下两件事情:

  • 将当前处理器缓存行的数据写回到系统内存。
  • 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。

总结下volatile的两条实现原则:

  • Lock前缀指令会引起处理器缓存回写到内存。
  • 一个处理器的缓存回写到内存会导致其他处理器的缓存无效。

synchronized

JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者实现细节不一样。
代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另一种方法来实现的,但是方法的同步可以使用这两个指令来实现。

monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,JVM要保证每个enter必须有对应的exit与之配对。任何对象都有一个monitor与之关联,并且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。

猜你喜欢

转载自blog.csdn.net/lhc2207221755/article/details/83933275