java学习-synchronized分析


关于synchronized

https://wiki.openjdk.java.net/display/HotSpot/Synchronization

其作为java 原语级别的同步工具,其通过字节码提升技术

  • 当其作用在代码块上时通过monitorEnter和monitorExit命令实现锁的操作;
  • 当其作用在方法上时其通过使用 ACC_SYNCHRONIZED标识

其底层实现原理实际是通过操作对象头来实现加锁的过程

锁升级过程 : 偏向锁(无锁)->轻量锁->膨胀锁

关于偏向锁的定义为 当线程第一次持有当前锁对象时,会在对象头中使用cas操作将线程id写入进去,表示当前对象偏向于当前线程;偏向锁实际并不算真正意义上的互斥锁,其只是通过设置标识来表示倾向过程;

对于偏向锁主要是存在于单个线程加锁,没有资源竞争的情况下;(个人理解:可以认为当且仅当只有当前一个线程会持有)

 当此时存在其他线程也准备竞争当前对象所有权时,才会出现,会出现以下情况(标准加锁过程):(jvm定义只有在对象头的最后两位 为 01时才表示当前对象为无锁状态)

  1. 偏向锁撤销,如果当前为解锁状态(最后两位为01),使用cas操作将当前持有锁的对象的栈信息写入,如果写入成功,则会晋升为轻量锁(00),如果写入失败,则判断当前持有锁的线程是否等于当前竞争锁的线程,如果线程一致,则会允许再次进入;反之则执行下一步
  2. 偏向锁撤销,如果当前为加锁状态(最后两位为00),在使用cas操作写入失败情况下,且当前持有锁的线程不等于当前竞争锁的线程,锁会晋升为膨胀锁(10);