synchorinzed作用域反编译出来的一点东西

synchronized可以作用在方法上,也可以作用在代码块上,而从编译角度来说,这两者是有所区别的。
如果作用在方法上,对对应的class文件使用javap进行反编译是这样的:
在这里插入图片描述
对应方法的标记位上有ACC_SYNCHRONIZED的标记,JVM是通过这个标记来识别这是一个synchronized方法

而如果作用在代码块上,反编译后发现,有一个monitorenter指令来控制线程进入同步代码块,对应的也有一个monitorexit指令来控制线程退出同步代码块。
在这里插入图片描述
这是它们的区别。

再加一个小彩蛋吧,整理一下回答cas的思路:
cas就是compareAndSwap,比较并替换,其实它的核心思想非常简单,就是维护了三个值:。。。。
cas它只是一种思想,操作系统就对这种思想进行了实现,从汇编角度来说,cas对应一个叫做cmpxchg的汇编指令,这个指令是cpu原语嘛,所以从操作系统角度就能保证这个比较并替换的操作是一个原子操作。
cas在java中的实现:atomic->unsafe->openjdk上的c++类,调用了cmpxchg这个汇编指令来完成比较并替换的操作。

发布了60 篇原创文章 · 获赞 7 · 访问量 3851

猜你喜欢

转载自blog.csdn.net/SCUTJAY/article/details/104950842