Synchronized原理图
2021-02-20 16:20:05   0  举报             
     
         
 Synchronized原理图
    作者其他创作
 大纲/内容
 CAS操作替换Thread Id
  开启新一轮锁竞争
  成功
  失败
  拷贝对象头的Mark Word到原持有偏向锁线程的锁记录中
  唤醒原持有偏向锁的线程
    自旋达到一定次数CAS操作依然没成功
  重量级锁10(标志位)
  检查对象头的Mark Word中记录的是否当前线程的id
  未活动状态/已退出同步代码块
  目前锁状态
  拷贝对象头中的Mark Word到当前线程的锁记录中
  原持有偏向锁线程释放锁空 | (是否偏向锁)0 |(标志位)01
  执行同步代码块
  原持有偏向锁线程
  检查原持有偏向锁的线程状态
  转变为重量级锁指向重量级锁monitor的指针|(标志位)10
  获得轻量级锁指向当前线程锁记录的指针|(标志位)00
  开始轻量级锁解锁
  获得偏向锁Thread Id | epoch | age | (是否偏向锁) 1 | (标志位)01
  未退出同步代码块
  原持有偏向锁的线程的栈中分配锁记录
  自旋
  轻量级锁00(标志位)
  是否偏向锁?
  从安全点继续执行
  当前线程
  唤醒被挂起的那些线程
  0(否)
  线程访问同步代码块
  升级为轻量级锁
  是
  原持有偏向锁线程获得轻量级锁指向原持有偏向锁线程锁记录的指针 |(标志位) 00
  1(是)
  当前线程栈中分配锁记录
  mutex挂起当前线程
  释放锁
  开始偏向锁撤销(等待竞争出现才释放锁的机制)
  再尝试
  CAS操作1&21、对象头中的Mark Word中锁记录指针是否人人指向当前线程锁记录2、拷贝在当前线程锁记录的Mark Word信息是否与对象头的Mark Word一致
  暂停原持有偏向锁的线程
  不是
  CAS操作将对象头的Mark Word中锁记录指针指向当前线程锁记录
  升级为重量级锁
  原持有偏向锁的线程到达安全点
  01(标志位)
   
 
 
 
 
  0 条评论
 下一页
  
   
   
   
   
  
  
  
  
  
  
  
  
 