(1)Synchronized关键字同步方法的底层原理
对于同步方法是使用修饰符上的ACC_SYNCHNIZED来完成的,不管使用哪一种,本质是对一个对象的监视器进行获取,同一个时刻只能有一个线程获取到由synchronized保护对象的监视器
(2)Synchronized关键字同步代码块的底层原理
对于synchronize同步块的实现底层使用了monitorent和monitorexit指令
(3)Synchronized锁升级分析,包括加锁解锁过程分析(偏向锁、轻量级锁、重量级锁)
偏向锁 -> 轻量级锁 -> 重量级锁
所谓偏向,就是偏袒的意思,偏向锁的初衷是在某个线程获得锁之后,消除这个线程锁重入(CAS)的开销,看起来让这个线程得到了偏护
访问Mark Word中偏向锁的标识是否设置成1,锁标识位是否为01,确认偏向状态.如果为可偏向状态,则判断当前线程ID是否为偏向线程如果偏向线程未只想当前线程,则通过cas操作竞争锁,如果竞争成功则操作Mark Word中线程ID设置为当前线程ID,如果cas偏向锁获取失败,则挂起当前偏向锁线程,偏向锁升级为轻量级锁
轻量锁
轻量级锁由偏向锁升级而来,偏向锁运行在一个线程同步块时,第二个线程加入锁竞争的时候,偏向锁就会升级为轻量级锁
线程由偏向锁升级为轻量级锁时,会先把锁的对象头MarkWord复制一份到线程的栈帧中,建立一个名为锁记录空间(Lock Record),用于存储当前Mark Word的拷贝。虚拟机使用cas操作尝试将对象的Mark Word指向Lock Record的指针,并将Lock record里的owner指针指对象的Mark Word。如果cas操作成功,则该线程拥有了对象的轻量级锁。第二个线程cas自选锁等待锁线程释放锁。如果多个线程竞争锁,轻量级锁要膨胀为重量级锁,Mark Word中存储的就是指向重量级锁(互斥量)的指针。其他等待线程进入阻塞状态
重量锁
自旋失败,很大概率 再一次自旋也是失败,因此直接升级成重量级锁,进行线程阻塞,减少cpu消耗。当锁升级为重量级锁后,未抢到锁的线程都会被阻塞,进入阻塞队列
Synchronized
最新推荐文章于 2022-12-12 09:01:54 发布