争后,轻量级锁会升级(膨胀)到重量级锁,此时只有一个线程可以获取到对象的监视器,其余线程会被park(暂停)且进入等待队列,等待唤醒。
synchronized的特性实现
为什么说synchronized
是悲观锁?来回顾下《一文看懂并发编程中的锁》中提到的悲观锁,悲观锁认为并发访问共享总是会发生修改,因此在进入临界区前一定会执行加锁操作。
那么对于synchronized
来说,无论是偏向锁,轻量级锁还是重量级锁,使用synchronized
总是会发生加锁,因此是悲观锁。
为什么说synchronized
是非公平锁?接着回顾下非公平锁,非公平性体现在发生阻塞后的唤醒并不是按照先来后到的顺序进行的。
在synchronized
中,默认策略是将cxq
队列中的数据移入到EntryList
后再进行唤醒,并没有按照先后顺序执行。实际上我们也不知道cxq
和EntryList
中的线程到底谁先进入等待的。
为什么说synchronized
是可重入锁?回顾下可重入锁,可重入指的是允许同一个线程反复多次加锁。
使用上,synchronized
允许同一个线程多次进入。底层实现上,synchronized
内部维护了计数器_recursions
,发生重入时,计数器+1,退出时计数器-1。
通过_recursions
的命名,我们也能知道Java中的可重入锁就是POSIX中的递归锁。
结语
本文的内容比较简单,主要是根据之前的内容回答一些热点问题。不说是做到学以致用,至少做到学习后,能回答一些面试问题。
当然更深层次的意义,在于指导我们合理的使用synchronized
以及我们可以从中借鉴到的设计思想。
好了,今天就到这里了,Bye~~