ReentreantLock:重入锁
参考:https://www.cnblogs.com/nullzx/p/4968674.html
一)、 ReentrantLock与synchronized的区别:
1).JDK1.5,在高并发的情况下,ReentrantLock的性能比Synchronized的性能好
2).JDK1.6,中Jvm对其进行了优化,两者差别不大。
3).使用ReentrantLock需要在finally中显示的释放锁,否则,程序出现异常就无法 释放锁。
4).使用Synchronized,JVM虚拟机总会在最后自动的释放synchronized锁。
二)、ReentrantLock的特点
分类: 公平锁/非公平锁
1).公平锁:
特点:保证锁等待队列中各线程是公平的,对锁的获取先进先出。
2).非公平锁:
特点:申请锁的线程可能插队,后申请锁的线程可能后进先出。
性能比较: 非公平锁的性能优于公平锁,优先选择非公平锁。
构造函数:指定锁的类型
public ReentrantLock(boolean fair)
3). 主要方法:
lock():
获取锁,若锁已占用,则等待
tryLock():
尝试获取锁,不等待立即返回,没有获得锁返回false,获得锁返回true
tryLock(long Time, TimeUnit unit): 在
指定时间里尝试获取锁
lockInterruptibly():
获得锁,但优先响应中断
unlock():
释放锁
三)、使用
1.lock():
特点:
1).返回值为void,没有锁则一直等待,直到获取锁。
2).等待期间,线程不响应中断
2.tryLock():
特点:
1).返回值为boolean ,立即返回获取锁的结果,获取成功返回true,失败返回false
2).尝试获取锁期间,不响应中断。
lock()与tryLock的区别():
1: lock拿不到锁会一直等待。tryLock是去尝试,拿不到就返回false,拿到返回true。
2: tryLock是可以被打断的,被中断 的,lock是不可以。
lockInterruptibly():
特点:
1).返回值为void,获取锁,如果获取失败,则一直等待,且优先处理中断
2).获取锁时会先使用Interrupt()判断中断状态并重置中断状态,当中断状态位 true时,抛出InterruptedExecption,否则执行获取锁操作
注意:
lockInterruptibly()在使用时,需要两个try语句,lockInterruptibly()声明在第一个try中,并对应catch处理,业务逻辑在第二个try中,关闭锁也在第二个try的finally中。
原因:如果使用一层的try,当线程的中断状态为true时,会抛出异常,进行catch处理,之后在finally释放锁,由于线程未获得锁,调用lock.unlock()会抛出IllegalMonitorStateExecption。
while(true){
try{
lock.lockInterruptibly();
try{
。。。。。
}finally{
lock.unlock();
}
}catch(InterruptedExecption e){
。。。。。
}
}
网友评论