ReentrantLock
java除了使用關鍵字synchronized外,還可以使用ReentrantLock實作獨占鎖的功能,而且ReentrantLock相比synchronized而言功能更加豐富,使用起來更為靈活,也更適合復雜的并發場景,這篇文章主要是從使用的角度來分析一下ReentrantLock,
ReentrantLock與synchronized來的區別
- synchronized是獨占鎖,加鎖和解鎖的程序自動進行,易于操作,但不夠靈活,ReentrantLock也是獨占鎖,加鎖和解鎖的程序需要手動進行,不易操作,但非常靈活,
- synchronized可重入,因為加鎖和解鎖自動進行,不必擔心最后是否釋放鎖;ReentrantLock也可重入,但加鎖和解鎖需要手動進行,且次數需一樣,否則其他執行緒無法獲得鎖,
- synchronized不可回應中斷,一個執行緒獲取不到鎖就一直等著;ReentrantLock可以相應中斷,
isFair()、isHeldByCurrentThread()和isLocked()
- lock.isFair()方法用來判斷lock鎖是公平鎖還是非公平鎖,公平鎖是指,執行緒獲得鎖的順序是按其等待鎖的先后順序來的,先來先獲得FIFO,反之,非公平鎖則是執行緒隨機獲得鎖的,lock默認是非公平鎖,
- lock.isHeldByCurrentThread()的作用是查詢當前執行緒是否保持此鎖定,和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當前執行緒是否處于等待lock的狀態,
- lock.isLocked()的作用是查詢此鎖定是否由任意執行緒保持,
spring redis lock里有對ReentrantLock的使用,org.springframework.integration.redis.util.RedisLockRegistry,有興趣可以看一下它的原始碼,
用法示例
一 isFair()方法用來判斷lock鎖是公平鎖還是非公平鎖
public class ServiceIsFair {
public ReentrantLock lock;
public ServiceIsFair(Boolean isFair) {
this.lock = new ReentrantLock(isFair);
}
public void serviceMethod(){
try {
lock.lock();
System.out.println("公平鎖情況:"+lock.isFair());
} finally {
lock.unlock();
}
}
}
二 lock.isHeldByCurrentThread()的作用是查詢當前執行緒是否保持此鎖定,與lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當前執行緒是否處于等待lock的狀態
public class ServiceIsHeldByCurrentThread {
private ReentrantLock lock;
public ServiceIsHeldByCurrentThread(Boolean isFair) {
this.lock = new ReentrantLock(isFair);
}
public void serviceMethod(){
try {
System.out.println("lock.isHeldByCurrentThread() "+lock.isHeldByCurrentThread());
lock.lock();
System.out.println("lock.isHeldByCurrentThread() "+lock.isHeldByCurrentThread());
} finally {
lock.unlock();
}
}
}
三 lock.isLocked()的作用是查詢此鎖定是否由任意執行緒保持
public class ServiceIsLocked {
private ReentrantLock lock;
public ServiceIsLocked(Boolean isFair) {
this.lock = new ReentrantLock(isFair);
}
public void serviceMethod(){
try {
System.out.println("lock.isLocked() "+lock.isLocked());
lock.lock();
System.out.println("lock.isLocked() "+lock.isLocked());
} finally {
lock.unlock();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61828.html
標籤:Java
