本文內容部分引自《Java多線程編程核心技術》,感謝作者!!!
代碼地址:https://github.com/xianzhixianzhixian/thread.git
方法isFair()、isHeldByCurrentThread()和isLocked()的用法和區別
1、lock.isFair()方法用來判斷lock鎖是公平鎖還是非公平鎖。公平鎖是指,線程獲得鎖的順序是按其等待鎖的先後順序來的,先來先獲得FIFO。反之,非公平鎖則是線程隨機獲得鎖的,lock默認是非公平鎖。
2、lock.isHeldByCurrentThread()的作用是查詢當前線程是否保持此鎖定,和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當前線程是否處於等待lock的狀態。
3、lock.isLocked()的作用是查詢此鎖定是否由任意線程保持。
方法isFair()、isHeldByCurrentThread()和isLocked()的用法示例
ServiceIsFair.java
/**
* lock.isFair()方法用來判斷lock鎖是公平鎖還是非公平鎖
* @author: xianzhixianzhixian
* @date: 2019-01-21 20:43
*/
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();
}
}
}
ServiceIsHeldByCurrentThread.java
/**
* lock.isHeldByCurrentThread()的作用是查詢當前線程是否保持此鎖定
* 和lock.hasQueueThread()不同的地方是:lock.hasQueueThread(Thread thread)的作用是判斷當前線程是否處於等待lock的狀態
* @author: xianzhixianzhixian
* @date: 2019-01-21 20:50
*/
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();
}
}
}
ServiceIsLocked.java
/**
* lock.isLocked()的作用是查詢此鎖定是否由任意線程保持
* @author: xianzhixianzhixian
* @date: 2019-01-21 20:54
*/
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();
}
}
}
Run.java
/**
* @author: xianzhixianzhixian
* @date: 2019-01-21 20:59
*/
public class Run {
public static void main(String[] args) throws Exception {
final ServiceIsFair serviceIsFair0 = new ServiceIsFair(true);
final ServiceIsFair serviceIsFair1 = new ServiceIsFair(false);
Runnable runnable0 = new Runnable() {
@Override
public void run() {
serviceIsFair0.serviceMethod();
}
};
Runnable runnable1 = new Runnable() {
@Override
public void run() {
serviceIsFair1.serviceMethod();
}
};
Thread thread0 = new Thread(runnable0);
thread0.start();
Thread thread1 = new Thread(runnable1);
thread1.start();
final ServiceIsHeldByCurrentThread serviceIsHeldByCurrentThread = new ServiceIsHeldByCurrentThread(true);
Runnable runnable2 = new Runnable() {
@Override
public void run() {
serviceIsHeldByCurrentThread.serviceMethod();
}
};
Thread thread2 = new Thread(runnable2);
thread2.start();
final ServiceIsLocked serviceIsLocked = new ServiceIsLocked(true);
Runnable runnable3 = new Runnable() {
@Override
public void run() {
serviceIsLocked.serviceMethod();
}
};
Thread thread3 = new Thread(runnable3);
thread3.start();
}
}
運行結果:創建了兩個鎖,公平鎖和非公平鎖,所以lock.isFair()一個爲true一個爲false。在lock.lock()執行之前線程未獲得鎖,所以lock.isHeldByCurrentThread()結果爲false,執行lock.lock()之後結果爲true。在lock.lock()執行之前沒有線程獲得鎖,所以lock.lock()爲false;在執行lcok.lock()之後,當前有線程已經獲得了鎖,所以lock.lsLocked()爲true。