ReentrantLock
ReentrantLock
参考:
http://langgufu.iteye.com/blog/2152164
ReentrantLock的使用:
一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
使用:
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