Synchronized锁升级过程:

1.如果一开始是无锁状态,那么第一个线程获取索取锁的时候,判断是不是无锁状态,如果是无锁(001),就通过CAS将mark word里的部分地址记录为当前线程的ID,同时最后倒数第三的标志位置为1,即倒数三位的结果是(101),表示当前为轻量级锁。下一个如果该线程再次获取该锁的时候,就直接判断mark word里记录的线程ID是不是我当前的线程ID,如果是的话,就成功获取到锁了,即不需再进行CAS操作,这就是相对轻量级锁来说,偏向锁的优势(只需进行第一次的CAS,而无需每次都进行CAS,当然这个理想过程是没有其他线程来竞争该锁)。如果中途有其他线程来竞争该锁,发现已经是101状态,那么就会查看偏向锁记录的线程是否还存活,如果未存活,即偏向锁的撤消,将markword记录的锁状态从101(偏向锁)置未001(无锁),然后重新偏向当前竞争成功的线程,如果当前线程还是存活状态,那么就升级成轻量级锁。

2.轻量级锁,在当前线程A创建一个锁记录,然后尝试通过CAS把markword更新为指向线程A的锁记录的指针,如果成功了,那么markword最后两位就变成00(轻量级锁),如果此时又来了一个B线程,那么会在B线程中创建一个锁记录,尝试CAS把markword更新为指向线程A的该锁记录的指针,如果失败的话,会查看markword的指针指向的是不是B线程中的某个栈帧(锁记录),如果是,即A和B是同一个线程,也就是当前操作是重入锁操作,即在当前线程对某个对象重复加锁,这是允许的,也就是可以获取到锁了。如果markword记录的不是B线程中的某个栈帧(锁记录),那么线程B就会尝试自旋,如果自选超过一定次数,就会升级成重量级锁(轻量级锁升级成重量级锁的第一种时机:自选次数超过一定次数),如果B线程在自选的过程中,又来了一个线程C来竞争该锁,那么此时直接轻量级锁膨胀成重量级锁(轻量级锁升级成重量级锁的第二种时机:有两个以上的线程在竞争同一个锁。注:A,B,C3线程>2个线程)

你可能感兴趣的:(java)