ReentrantLock

ReentrantLock

参考:

https://github.com/Mr-YangCheng/ForAndroidInterview/blob/master/java/%5BJava%5D%20%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%AD%A5%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%9Asychronized%E3%80%81lock%E3%80%81reentrantLock%E5%88%86%E6%9E%90.md

http://langgufu.iteye.com/blog/2152164

 

ReentrantLock的使用:

一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。

使用:

ReentrantLock

 

ReentrantLock相对于synchronized多了三个高级功能:      

1、等待可中断     

在持有锁的线程长时间不释放锁的时候,等待的线程可以选择放弃等待.    

tryLock(long timeout, TimeUnit unit) 

如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断。

如果使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情

2、公平锁     按照申请锁的顺序来一次获得锁称为公平锁.synchronized的是非公平锁,ReentrantLock可以通过构造函数实现公平锁.

new RenentrantLock(boolean fair)

对于效率来讲,当然是非公平锁效率更高,因为公平锁还要判断是不是线程队列的第一个才会让线程获得锁。 

3、绑定多个Condition    

通过多次newCondition可以获得多个Condition对象,可以简单的实现比较复杂的线程同步的功能.通过await(),signal();

这里的condition相当于信号量,一个signal之后,另外一个await的位置才能收到信号量开始工作。

总结:

资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

如果加入volatile来对比的话就是

线程与主线程之间的对象同步用volatile。

少量线程之间存在并发用synchronized

大量线程之间存在并发用reentrantLock