转载请以链接形式标明出处: 本文出自:103style的博客
Java代码 编译之后 得到 Java字节码,被 类加载器加载到JVM
中,最终 转化为汇编指令。
volatile
是轻量级的synchronized
,被volatile
修饰的变量,在一个线程能读到这个变量被另一个线程修改之后的值。
volatile
不会引起线程上下文切换和调度。
JVM 基于进入和退出Monitor
对象来实现方法同步和代码块同步。
monitorenter
和monitorexit
指令实现的monitorenter
和monitorexit
指令来实现。monitorenter
指令是在编译后插入到同步代码块的开始位置,monitorexit
是插入到方法结束处和异常处。
JVM要保证每个monitorenter
必须有对应的monitorexit
与之配对。
任何对象都有一个monitor
与之关联,当且一个monitor
被持有后,它将处于锁定状态。线程执行到monitorenter
指令时,将会尝试获取对象所对应的monitor
的所有权,即尝试获得对象的锁。
synchronized
用的锁是存在Java对象头里的。在32位
虚拟机中,1字宽
等于4字节
,即32bit
。
3个字宽
存储对象头。2字宽
存储对象头。级别从低到高依次是:
原子(atomic
)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation
)意为“不可被中断的一个或一系列操作”。
LOCK#
信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。ABA
问题的解决思路就是 使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号
加1
,那么A→B→A
就会变成1A→2B→3A
。
原子操作类AtomicStampedReference
的compareAndSet
方法的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。