JAVA 1.5 并发之 ReentrantLock
在文章里我不打算具体讲Lock的实现,对此有兴趣的请点击这篇博文
http://www.blogjava.net/BucketLi/archive/2010/09/30/333471.html
我是一个实用派,所以我想讲讲这货怎么用!讲得不全请多包涵
在Lock出现之前,一般实用的并发控制就是synchronized,用一个关键字包起整段代码,看起来比较简洁也简单粗暴是吧
但是很明显这种做法不够灵活,所以Lock就出现啦,但是本文只讲ReentrantLock
首先,New 一个 Lock
new ReentrantLock(); 默认是unfair
new ReentrantLock(bool fair); 一般都是用来设置为fair
公平锁就是大家有序的去上锁,效率比较低,而不公平锁基本靠抢,个人理解是对次序不重要的话就用不公平锁
接着,上锁
1) lock(); 这就是不顾一切的去抢Lock, 直到抢到
2) tryLock(); 尝试获取Lock, 如有则true, 没有则 false
3) tryLock(long timeout, TimeUnit unit); 在一段时间内尝试获取Lock, 其他同上
PS: 锁内是有计数的,如果在一个锁内继续上锁 则需连续解锁
用完解锁
Lock.unlock();
代码演示
public static void main(String[] args) throws InterruptedException {final ExecutorService exec = Executors.newFixedThreadPool(4);
final ReentrantLock lock = new ReentrantLock();
final Condition con = lock.newCondition();
final int time = 2;
final Runnable add = new Runnable() {
public void run() {
System.out.println("Lock in " +Thread.currentThread().getId());
lock.lock();
try {
con.await(time, TimeUnit.SECONDS);
//或者执行一些事情} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("Lock out" +Thread.currentThread().getId());
lock.unlock();
}
}
};
for(int index = 0; index < 4; index++)
new Thread(add).start();
}
输出:
Lock in 12
Lock in 14
Lock in 15
Lock in 13
Lock out13
Lock out14
Lock out12
Lock out15
这里要注意的是 lock out 统一出现在两秒之后,就是说在await的时候lock其实是被暂时释放了,这个在特定情况下有作用
await等待时间内对应的是condition.signal() 用来唤醒这个锁
如果那段代码是执行耗时的操作则是做一个走一个 与sleep()相同
以上是 JAVA 1.5 并发之 ReentrantLock 的全部内容, 来源链接: utcz.com/z/394516.html