首页 > 其他 > 详细

lockInterruptibly 和 lock

时间:2015-05-18 02:05:51      阅读:265      评论:0      收藏:0      [点我收藏+]

一.序言

? ??ReentrantLock 锁有好几种,除了常用的lock tryLock 等意外,其中有个lockInterruptibly 用的比较少,看了下JDK 说明,官方的东西总是那么不容易理解,这里用稍微通俗的语言来描述一下。

?

二.栗子

? ? ?1.我们用张三和李四 吃水果来描述:

? ? ? ? 如果张三吃苹果->休息5秒->吃香蕉

? ? ? ? 李四:发现张三在吃,就等待,直到李四吃完

import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by qqr on 15/5/17.
 */
public class Lock {


    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(new TaskThread());
        t1.setName("张三 ");
        Thread t2  = new Thread(new TaskThread());
        t2.setName("李四 ");
        t1.start();
        Thread.sleep(100);// 保证先后顺序

        t2.start();
        Thread.sleep(100);
        // 中断
        t2.interrupt();


    }


    static class TaskThread implements Runnable{
        // 所有线程都用同一把锁
        static ReentrantLock lock = new ReentrantLock();

        @Override
        public void run() {

            try {
                // 
                lock.lockInterruptibly();
                System.out.println(Thread.currentThread().getName() + " 吃苹果");

                Thread.sleep(5 * 1000);

                System.out.println(Thread.currentThread().getName() + " 吃香蕉");
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + " 被中断了,没吃了");
            }finally {
                lock.unlock();
            }

        }

    }
}

? ?返回结果是:

? ?

张三  吃苹果
张三  吃香蕉
李四  吃苹果
李四  被中断了,没吃了

?

? ?第一次如果用 lock() ,那么就是正常的逻辑:

? ?张三持有锁的时候,李四没有获得锁,打断效果也会阻塞着,等张三吃完,李四吃苹果,然后被打断,就是上面结果了。

?

? ? ?如果换成lockInterruptibly,那么结果是:

? ??

张三  吃苹果
李四  被中断了,没吃了
Exception in thread "李四 " java.lang.IllegalMonitorStateException
张三  吃香蕉

? ?

? ? ?我们会发现,即使李四没有获得锁,也是可以被打断的, 这个区别是很明显的。

?

?

?四.小结

? ? ? 1.这里仅仅简单理解下他效果,可能并不全

? ? ? 2.没找到合适的场景,遇到的场景 或者 解释有问题,请分享 和指出,谢谢。

?

? ?

lockInterruptibly 和 lock

原文:http://greemranqq.iteye.com/blog/2211825

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!