一、Synchronized关键字原理
什么是Synchronized
Synchronized是java内建的同步机制,提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取锁的线程会被阻塞
Synchronized核心组件
-
Wait Set
那些调用wait方法被阻塞的线程被放置在这里
-
Contention List
竞争队列,所有请求锁的线程首先被放在这个竞争队列中
-
Entry List
Connection List 中那些有资格成为候选资源的线程被移动到Entry List
-
OnDeck
任意时刻,最多只有一个线程正在竞争锁资源,该线程被称为OnDeck
-
Owner
当前已经获取到资源的线程被称为 Owner
-
!Owner
当前释放锁的线程
图中需要注意的是 :
步骤2中的移动线程是在Owner线程在unlock时,将Contention List中的部分线程移动到Entry List
步骤3中Owner线程并不直接把锁传递给OnDeck线程,而是把锁竞争的权利交给OnDeck,OnDeck需要重新竞争锁,JVM中这种选择行为称为 “竞争切换”
Synchronized是非公平锁,Synchronized在线程进入Contention List时,等待的线程会先尝试自旋获取锁(CAS),如果获取不到就进入Contention List,这对于已经进入队列的线程是不公平的,还有一个不公平的事情是自旋获取锁的线程还可能直接抢占OnDeck线程的锁资源
在Java 1.6中,Synchronized进行了优化,有适应自旋,锁消除,锁粗化,轻量级锁及偏向锁,效率上有了本质的提高