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