一段重入鎖的程式碼分析

來源:互聯網
上載者:User

代碼如下
來源:http://topic.csdn.net/u/20080423/00/0c5da041-4fd2-4ce5-85a2-bf43a288f46a.html

import java.util.concurrent.*;
import java.util.concurrent.locks.*;

/** *//**
 *  */
public class Test ...{
  private ReentrantLock lock = new ReentrantLock();

  public void untimed() ...{
    boolean captured = lock.tryLock();
    try ...{
      System.out.println("tryLock(): " + captured);
    } finally ...{
      if (captured)
        lock.unlock();
    }
  }

  public void timed() ...{
    boolean captured = false;
    try ...{
      captured = lock.tryLock(2, TimeUnit.SECONDS);
    } catch (InterruptedException e) ...{
      throw new RuntimeException(e);
    }
    try ...{
      System.out.println("tryLock(2, TimeUnit.SECONDS): " + captured);
    } finally ...{
      if (captured)
        lock.unlock();
    }
  }

  public static void main(String[] args) ...{
    final Test al = new Test();
    al.untimed(); // True -- lock is available
    al.timed(); // True -- lock is available
    // Now create a separate task to grab the lock:
    new Thread() ...{
      ...{
        setDaemon(true);
      }

      public void run() ...{
        al.lock.lock();
        System.out.println("acquired");
      }
    }.start();
    Thread.yield(); // Give the 2nd task a chance
    al.untimed(); // False -- lock grabbed by task
    al.timed(); // False -- lock grabbed by task
  }
}

解釋:
1 單獨獲得鎖都沒有問題 
2 如果有另一個線程在爭奪鎖時就得看誰先拿到了 
3 al.lock.lock(); 這個是鎖的簡單使用,是 al對象的 lock 屬性,調用了它的lock()方法,拿到了鎖 
4 此程式根據線程啟動的速度和系統調度不同,每次運行結果很可能不同。 那個tryLock():由於先調用,且為立即拿到鎖,成功的幾率稍大一些 

以下幾種輸出都是正常的

tryLock(): true
tryLock(2, TimeUnit.SECONDS): true
acquired
tryLock(): false
tryLock(2, TimeUnit.SECONDS): false

tryLock(): true
tryLock(2, TimeUnit.SECONDS): true
tryLock(): true
tryLock(2, TimeUnit.SECONDS): true
acquired

tryLock(): true
tryLock(2, TimeUnit.SECONDS): true
tryLock(): true
acquired
tryLock(2, TimeUnit.SECONDS): false

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.