一段重入锁的代码分析
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
来源: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
相关文章推荐
- 一段javascript代码分析
- 汇编并分析一段简单C代码
- 这是一段对windows启动代码的中文分析
- 多线程程序一段问题代码分析
- 一段js代码的分析
- 一段标准的数据库连接的代码及详细分析
- notify和notifyAll的一段代码分析
- 对一段有趣代码分析
- 分析网友的一段求救小程序,20行代码有多少错误?多少可改进之处?
- 一段流量分析工具代码检视
- 一段代码分析 理解多线程交互
- js中闭包来实现bind函数的一段代码的分析
- 每天分析一段linux内核代码---<linux/sched.h>
- 一段代码深入分析
- SVNKIT一段代码的分析
- 多线程程序一段问题代码分析(生产者消费者)
- [Happy Coding] 一段调用STL算法的程序代码的效率分析
- js构造函数原型(prototype)问题分析(一段烂代码引发的博客)
- 一段简单C++代码问题分析
- 谁能帮我分析一段代码?