一段重入锁的代码分析

代码如下
来源: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






<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值