您的位置:首页 > 编程语言

一段重入锁的代码分析

2008-04-23 06:30 274 查看
代码如下
来源: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: