Java多線程問題--方法isFair()、isHeldByCurrentThread()和isLocked()的用法和區別

本文內容部分引自《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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章