synchronized原理

首先要介绍对象头,对象头包含两个部分,一个是指向类信息,一个保存对象运行时相关数据,称之为mark word。
偏向锁:线程申请获取偏向锁时,首先检测锁对象ThreadID是否为当前线程id,如果是,则直接进入临界区,否则用cas操作尝试修改ThreadID为当前线程id,如果成功则进入临界区,如果失败表示锁存在竞争,偏向锁膨胀为轻量级锁。
轻量级锁:当线程申请获取轻量级锁时,首先在当前线程的栈帧中创建一个Lock Record锁记录空间,然后将锁对象的mark word拷贝到锁记录中,拷贝成功之后,使用CAS操作尝试将对象的mark word指向锁记录,并将锁记录里的owner指向mark word,如果成功则表示获取到该锁,如果失败,则表明存在多个锁竞争,则膨胀为重量级锁。
重量级锁:当锁是重量级锁时,mark word中重量级锁指针指向monitor对象,monitor有等待队列list,锁池set,owner锁对象的拥有者,count锁记录,如果线程没有成功申请锁,则将该线程加入到锁池中,如果是调用wait方法,则将线程加入到等待队列中,当其他线程调用notify唤醒线程时,将线程从等待队列移入锁池中,只有锁池中的线程才可以竞争锁资源。

posted on 2019-04-25 12:38  楼兰剑客  阅读(103)  评论(0编辑  收藏  举报

导航