問題

避免Java多執行緒中僵局的策略之一是使用超時. 假設,一個執行緒已經獲得對一個資源的鎖定,現在等待對另一個資源的鎖定.在一段時間之後,如果它無法在resource2上獲取鎖,則它應該停止在resource2上等待鎖定.此外,它應該在resource1上釋出鎖定.因此將避免死鎖.

但是如何在Java中實現它?如何顯式地“釋放”鎖?如何定義超時等待鎖.

什麼是確切的java命令和語法.請任何hello-worldshell示例?

  最佳答案

這是一個帶有2個鎖和2個執行緒的人造示例,嘗試以不同的順序獲取它們.沒有超時,程式碼將陷入僵局.

 public static void main(String[] args) throws Exception {
    final ReentrantLock lock1 = new ReentrantLock();
    final ReentrantLock lock2 = new ReentrantLock();
    Runnable try1_2 = getRunnable(lock1, "lock 1", lock2, "lock 2");
    Runnable try2_1 = getRunnable(lock2, "lock 2", lock1, "lock 1");
    new Thread(try1_2).start();
    new Thread(try2_1).start();
}

private static Runnable getRunnable(final ReentrantLock lock1, final String lock1Name, final ReentrantLock lock2, final String lock2Name) {
    return new Runnable() {
        @Override
        public void run() {
            try {
                if (lock1.tryLock(1, TimeUnit.SECONDS)) {
                    System.out.println(lock1Name + " acquired in thread " + Thread.currentThread());
                    if (lock2.tryLock(1, TimeUnit.SECONDS)) {
                        System.out.println(lock2Name + " acquired in thread " + Thread.currentThread());
                        Thread.sleep(2000);
                    } else {
                        System.out.println("Could not acquire "+lock2Name + " in thread " + Thread.currentThread());
                        lock1.unlock();
                        System.out.println(lock1Name + " released in thread " + Thread.currentThread());
                    }
                } else {
                    System.out.println("Could not acquire " + lock1Name + " in thread " + Thread.currentThread());
                }
            } catch (InterruptedException e) {
                //you should not ignore it
            } finally {
                if (lock1.isHeldByCurrentThread()) lock1.unlock();
                if (lock2.isHeldByCurrentThread()) lock2.unlock();
            }
        }
    };
}
 

  相同標籤的其他問題

javamultithreadinglockingtimeoutdeadlock