java~ReentrantLock的介紹
ReentrantLock
java除了使用關(guān)鍵字synchronized外,還可以使用ReentrantLock實(shí)現(xiàn)獨(dú)占鎖的功能。而且ReentrantLock相比synchronized而言功能更加豐富,使用起來(lái)更為靈活,也更適合復(fù)雜的并發(fā)場(chǎng)景。這篇文章主要是從使用的角度來(lái)分析一下ReentrantLock。
ReentrantLock與synchronized來(lái)的區(qū)別
- synchronized是獨(dú)占鎖,加鎖和解鎖的過(guò)程自動(dòng)進(jìn)行,易于操作,但不夠靈活。ReentrantLock也是獨(dú)占鎖,加鎖和解鎖的過(guò)程需要手動(dòng)進(jìn)行,不易操作,但非常靈活。
- synchronized可重入,因?yàn)榧渔i和解鎖自動(dòng)進(jìn)行,不必?fù)?dān)心最后是否釋放鎖;ReentrantLock也可重入,但加鎖和解鎖需要手動(dòng)進(jìn)行,且次數(shù)需一樣,否則其他線程無(wú)法獲得鎖。
- synchronized不可響應(yīng)中斷,一個(gè)線程獲取不到鎖就一直等著;ReentrantLock可以相應(yīng)中斷。
isFair()、isHeldByCurrentThread()和isLocked()
- lock.isFair()方法用來(lái)判斷l(xiāng)ock鎖是公平鎖還是非公平鎖。公平鎖是指,線程獲得鎖的順序是按其等待鎖的先后順序來(lái)的,先來(lái)先獲得FIFO。反之,非公平鎖則是線程隨機(jī)獲得鎖的,lock默認(rèn)是非公平鎖。
- lock.isHeldByCurrentThread()的作用是查詢當(dāng)前線程是否保持此鎖定,和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當(dāng)前線程是否處于等待lock的狀態(tài)。
- lock.isLocked()的作用是查詢此鎖定是否由任意線程保持。
spring redis lock里有對(duì)ReentrantLock的使用,org.springframework.integration.redis.util.RedisLockRegistry,有興趣可以看一下它的源碼。
用法示例
一 isFair()方法用來(lái)判斷l(xiāng)ock鎖是公平鎖還是非公平鎖
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()的作用是查詢當(dāng)前線程是否保持此鎖定,與lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當(dāng)前線程是否處于等待lock的狀態(tài)
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();
}
}
}
浙公網(wǎng)安備 33010602011771號(hào)