Java重入锁ReentrantLock

Java重入锁ReentrantLock

Java重入锁ReentrantLock

Java中的锁除了sysnchronized关键之,还有Lock接口,ReentrantLock就是其中的一个实现类。

重入锁ReentrantLock和sysnchronized

相同点就是都实现了独占锁的功能,并且都支持重入,ReentrantLock是显式的需要调用lock,sysnchronized是隐式的。

重入的意思是第一次获取了锁,在持有锁期间可以再次获取该锁,不用等待,也就是不会阻塞。

不同点:

1、ReentrantLock是可以中断的,即调用响应中断的获取锁的方法lockInterruptibly

2、可以实现公平锁(ReentrantLock(boolean fair)),在创建实例的时候传到一个是否公平的参数。公平锁就是根据请求的顺序获取锁,等待时间最长的优先获取。公平锁可以解决饥饿发生概率,但是会频繁切换线程。

3、可以设置超时时间tryLock(long time, TimeUnit unit),解决死锁的情况。

实现锁的重入

1、线程再次获取锁,如果当前锁被占有,直接获取直接成功

2、锁的释放,如果获取了x次,在释放的时候也会释放x次,获取一次计数器加一,释放计数一次减一,等完全释放后计数为零,其他线程就可以再次获取。

Java重入锁ReentrantLock

非公平锁的获取

简单例子

如果使用lock方法,需要在finally块中执行unlock方法。

Java重入锁ReentrantLock

简单应用的例子

输出结果如下,线程2在获取锁时发生了中断。

Java重入锁ReentrantLock

输出信息


分享到:


相關文章: