![Java重入锁ReentrantLock](http://p2.ttnews.xyz/loading.gif)
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](http://p2.ttnews.xyz/loading.gif)
非公平锁的获取
简单例子
如果使用lock方法,需要在finally块中执行unlock方法。
简单应用的例子
输出结果如下,线程2在获取锁时发生了中断。
输出信息
閱讀更多 Java猿 的文章