JAVA 1.5 并发之 ReentrantLock

时间:2023-01-28 20:51:04

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