在文章里我不打算具体讲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()相同