syncronized锁升级流程
2016-08-20 14:59:45 0 举报
在Java中,synchronized锁的升级流程主要包括偏向锁、轻量级锁和重量级锁三个阶段。当一个线程首次访问同步块时,会进入偏向锁状态。如果此时有另一个线程也访问该同步块,那么偏向锁就会升级为轻量级锁。如果此时有多个线程同时访问该同步块,那么轻量级锁就会升级为重量级锁。重量级锁会导致线程阻塞,直到获得锁的线程执行完毕释放锁为止。
作者其他创作
大纲/内容
获取锁
获取锁cas替换mark word失败
执行完同步块或还没有执行同步块
恢复线程1
释放锁cas替换mark word失败因为锁标记已经是重量级锁
Syncronized锁升级流程图
线程3阻塞
执行同步块
如果当前锁状态是无锁,则设置为偏向锁,并且设置当前线程id,之后当前线程再次进入这个锁相关的同步块时,只需比较当前线程id与mark word的线程id是否相等,而不需要再进行CAS
撤销偏向锁cas自旋尝试获取锁即cas替换mark word
CAS设置mark word指向当前lock record
线程3
释放锁(CAS还原mark word),并将mark word中的线程id设置为空升级为轻量级锁
获取到锁当前锁状态为轻量级锁
当前线程建立lock record
CAS替换mark word失败
线程2
修改mark work锁标记为重量级锁
释放锁并唤醒线程3
线程1
当前线程在线程栈建立lock record并将锁对象mark word拷到lockrecord
线程1暂停
0 条评论
下一页