可重入锁

为什么synchronized是重入锁?

synchronized是可重入锁Demo
输出结果

互斥同步手段

在Java中,最基本的互斥同步手段就是synchronized关键字,synchronized关键字经过编译之后,会在同步块的前后分别形成monitorenter和monitorexit这两个字节码指令,这两个字节码都需要一个reference类型的参数来指明要锁定和解锁的对象。

在虚拟机规范对monitorenter和monitorexit的行为描述中,有两点是需要特别注意的。

1.首先,synchronized同步块对同一条线程来说是可重入的,不会出现自己把自己锁死的问题。

2.其次,同步块在已进入的线程执行完之前,会阻塞后面其他线程的进入。


除了synchronized之外,我们还可以使用java.util.concurrent包中的重入锁(ReentrantLock)来实现同步

相比synchronized,ReentrantLock增加了一些高级功能,主要有以下3项:

等待可中断、可实现公平锁,以及锁可以绑定多个条件。

等待可中断 : 是指当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情,可中断特性对处理执行时间非常长的同步块很有帮助。

公平锁 : 是指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁;而非公平锁则不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁。synchronized中的锁是非公平的,ReentrantLock默认情况下也是非公平的,但可以通过带布尔值的构造函数要求使用公平锁。

锁绑定多个条件 : 是指一个ReentrantLock对象可以同时绑定多个Condition对象,而在synchronized中,锁对象wait()和notify()或notifyAll()方法可以实现一个隐含的条件,如果要和多于一个的条件关联的时候,就不得不额外地添加一个锁,而ReentrantLock则无须这样做,只需要多次调用newCondition()方法即可。

你可能感兴趣的:(可重入锁)