一.序言
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 张三 吃香蕉
我们会发现,即使李四没有获得锁,也是可以被打断的, 这个区别是很明显的。
在linkedBlockingQuene 的put/take 方法中,我们可以看到类似这样的代码:
public void put(E e) throws InterruptedException { // .... final ReentrantLock putLock = this.putLock; final AtomicInteger count = this.count; putLock.lockInterruptibly(); try { while (count.get() == capacity) { notFull.await(); } // .... } }
最为加锁的阻塞队列, 这里不允许多线程同时put,多线程对进入等待,但是用了lockInterruptibly,那么就意味着可以中断那些等待着的线程
四.小结
1.这里仅仅简单理解下他效果,可能并不全
2.遇到其他的场景 或者 解释有问题,请分享 和指出,谢谢。
相关推荐
redisson lock和tryLock 分布式锁简单练习
关键字-回车映射-ahk回车映射-左手回车 ;;快捷键x说明 上下左右 ... CapsLock+q 箭头上--防止误触屏-CapsLock+q也映射为箭头上 ;; CapsLock+e 删除键-删除前面的-Backspace ;; CapsLock+r 删除键-删除后面的--Del
修改注册表的文件,更改win7左ctrl和capslock键(reg文件一键导入)
因此,在对Package/Procedure/Function/View进行编译和分析的时候,我们必须确定此时没有人正在编译和分析相同的对象,即确保没有人也在此时改变这些需要重定义(drop和recreate)的对象的定义。
有关oracle当中锁的描述,Latch和Lock的区别,挺不错的。
java多线程之lock。 Lock的基本用法如下,为了防止异常退出时没有释放锁,一般都在拿到锁后立马try,try住所有临界区的代码,然后finally释放锁。
Lock锁是对象锁,仅在同一对象中,锁才会生效。(不做论证) (以下场景皆为单例模式下运行) lock.lock()的加锁方式,会使后续请求的线程堵塞等待。(方案A) lock.tryLock()的加锁方式,不会堵塞,会立即返回加锁...
实现yarn.lock与package-lock.json相互转换
lock锁,lock锁和synchronized的对比 # Lock锁 JDK5.0后Java提供了一种更加强大的线程同步机制。一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问...
gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 gradle lock文件清除 ...
Lock、Synchoronized和ReentrantLock的使用
significance of a lock-in amplifier. As an introduction to the subject there follows a simple intuitive account biased towards light measurement applications. All lock-in amplifiers, whether ...
Active Lock可以将任何一款普通的U盘变成您的Windows登录钥匙。 启用Active Lock后,用户需要插入USB钥匙盘才能登录Windows操作系统,拔出U盘时自动锁住电脑。Active Lock采用Windows登录验证接口,支持Windows 2000...
设定CapsLock ScrollLock NumLock
并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock。 Synchronized 和 Lock的概念 Synchronized 是Java 并发编程中很重要的关键字,另外一个很重要的是 volatile。Syncronized...
PowerManager.WakeLock 有加锁和解锁两种状态,加锁的方式有两种: 第一种是永久的锁住,这样的锁除非显式的放开,否则是不会解锁的,所以这种锁用起来要非常的小心。 第二种锁是超时锁,这种锁会在锁住后一段时间...
报错大致意思就是创建index.lock文件失败,因为已经存在index.lock文件了. index.lock文件是在.git下面, 而.git是一般是隐藏的, 那么可以通过以下命令删除即可. rm -rf /Users/dianji/project/ccpay.h5/.git/index....
Capslock++(AutoHotKey脚本),改造Capslock键,快速提升工作效率
基础理论知识,描述lock和synchronized的区别和基础的理论,其中还有死锁等基础概念。
判断CapsLock键有没有打开 判断CapsLock键有没有打开 判断CapsLock键有没有打开