代碼如下:
來源: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