Java开发之高并发必备篇——Lock和ReentrantLock

Posted weixin_43802541

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java开发之高并发必备篇——Lock和ReentrantLock相关的知识,希望对你有一定的参考价值。

ReentrantLock锁的使用

· 响应中断

响应中断指的是当一个线程使用ReetrantLock获取不到锁的时候,不会一直等着获取从而导致线程阻塞。假设我们有两个线程t1、t2,线程t1可以通过lock锁的lockInterruptibly()方法获取一个可以被中断的重入锁,另外一个线程t2可以通过调用interrupt()打断线程t1的执行并获取t1的锁,这样t2线程在获取锁的时候就不会一直进行阻塞等待。使用响应中断我们就可以避免死锁的问题。案例如下:

上面代码中,我们创建了t1、t2两个线程,t1线程先使用lock获取了锁然后进行sleep休眠1s,之后尝试lock2获取锁;而t2线程构造方法中传入锁的顺序跟t1是相反的所以它运行是先使用lock2获取到锁,然后休眠1s尝试使用lock获取锁,双方都等着对方释放锁之后才能获取到锁,这时候就形成了死锁。

下面我们调用t1线程的中断方法来让ReetrantLock响应中断,这样t2线程就获取lock锁就不会阻塞,我们看下运行结果:

· 线程通信

ReetrantLock可以通过newCondition()方法获取一个Condition对象,我们看下Condition提供了那些操作:

通过Condition接口定义的方法我们发现跟之前Object的wait和notify功能几乎差不多,所以使用Condition对象的方法也可以完成线程间的通信。案例如下:

运行结果如下:

总结
ReentrantLock对于Lock接口锁的实现类,内部使用了AQS的实现可以完成公平锁、非公平锁实现,它也可以实现线程响应中断、限时等待、线程间通信等功能,体现出了比synchronized锁更多和更灵活的锁操作。

以上是关于Java开发之高并发必备篇——Lock和ReentrantLock的主要内容,如果未能解决你的问题,请参考以下文章

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇:Lock和ReentrantLock

Java开发之高并发必备篇——Lock和ReentrantLock

Java开发之高并发必备篇——线程的状态调度和操作方法

Java开发之高并发必备篇——线程的状态调度和操作方法