汇智动力

售前免费咨询热线: 4 0 0 - 1 8 6 - 0 9 0 5
汇智资讯Huizhi information

当前位置:首页 »Java开发之高并发必备篇(六)——Lock和ReentrantLock(3)

Java开发之高并发必备篇(六)——Lock和ReentrantLock(3)

日期:2022-10-20 18:02:48 访问量: 来源:

ReentrantLock锁的使用

 

· 响应中断

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

 

 

Java开发之高并发必备篇

 

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

 

Java开发之高并发必备篇

 

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

 

 

Java开发之高并发必备篇

 

· 线程通信

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

 

Java开发之高并发必备篇

 

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

 

Java开发之高并发必备篇

 

运行结果如下:

 

Java开发之高并发必备篇

 

总结

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

相关阅读Reading

全国热线:400-186-0905

周一至周日9:30-24:00

我要咨询
汇智动力微信

汇智动力微信公众号