代码如下:
来源:http://topic.youkuaiyun.com/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<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
本文通过一个Java示例程序深入探讨了ReentrantLock类中的tryLock方法的两种使用方式:无参与带超时时间参数的方法,并分析了在多线程环境下锁的获取情况。

1348

被折叠的 条评论
为什么被折叠?



