Lock的lock()方法
ReentrantLock是JDK唯一实现了Lock接口的类
lock()
是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。
由于在前面讲到如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。
实例
各自独立的Lock对象
@Testpublic void testLock1() {// 两个线程的lock对象是彼此独立,没有任何关系,没有起到锁的作用new Thread() {@Overridepublic void run() {Lock lock = new ReentrantLock();String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁System.out.println(tName+"获取到锁!");try {int n = 1 / 0;System.out.println(n);for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}} catch (Exception e) {System.out.println(tName+"出错了!!!");}finally {//lock.unlock();}}}.start();new Thread() {@Overridepublic void run() {Lock lock = new ReentrantLock();String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁,此时获取不到锁,因为线程1出错了,lock()不会主动释放锁,线程1又没有释放锁,所以就死锁了。System.out.println(tName+"tName获取到锁!");for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}}}.start();}
运行结果:
Thread-0还没有锁,开始主动获取锁......
Thread-0获取到锁!
Thread-0出错了!!!
Thread-1还没有锁,开始主动获取锁......
Thread-1tName获取到锁!
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
锁对象是同一个
两个线程的锁对象是同一个,当获取锁的线程没有释放锁的时候,就产生了死锁,其他线程只能无止尽地等待
@Testpublic void testLock2() {//两个线程的锁对象是同一个,当获取锁的线程没有释放锁的时候,就产生了死锁,其他线程只能无止尽地等待Lock lock = new ReentrantLock();new Thread() {@Overridepublic void run() {String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁System.out.println(tName+"获取到锁!");try {int n = 1 / 0;System.out.println(n);for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}} catch (Exception e) {System.out.println(tName+"出错了!!!");}finally {}}}.start();new Thread() {@Overridepublic void run() {String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁,此时获取不到锁,因为之前出错了,lock()不会主动释放锁,线程又没有释放锁,所以就死锁了。System.out.println(tName+"tName获取到锁!");for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}}}.start();}
运行结果:
Thread-0还没有锁,开始主动获取锁......
Thread-0获取到锁!
Thread-0出错了!!!
Thread-1还没有锁,开始主动获取锁......
释放锁
两个线程的锁对象是同一个,当获取锁的线程没有释放锁的时候,就产生了死锁,其他线程只能无止尽地等待
在try-finally里不管是顺利执行完,还是出错,都要主动释放锁,则其他线程就能获取到
@Testpublic void testLock3() {//两个线程的锁对象是同一个,当获取锁的线程没有释放锁的时候,就产生了死锁,其他线程只能无止尽地等待//在try-finally里不管是顺利执行完,还是出错,都要主动释放锁,则其他线程就能获取到Lock lock = new ReentrantLock();new Thread() {@Overridepublic void run() {String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁System.out.println(tName+"获取到锁!");try {int n = 1 / 0;System.out.println(n);for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}} catch (Exception e) {System.out.println(tName+"出错了!!!");}finally {System.out.println(tName+"释放锁!!");lock.unlock();}}}.start();new Thread() {@Overridepublic void run() {String tName=Thread.currentThread().getName();System.out.println(tName+"还没有锁,开始主动获取锁......");lock.lock();// 主动获取锁,此时获取不到锁,因为之前出错了,lock()不会主动释放锁,线程又没有释放锁,所以就死锁了。System.out.println(tName+"tName获取到锁!");for (int i = 0; i < 10; i++) {System.out.println(tName+":" + i);}}}.start();}
运行结果:
Thread-0还没有锁,开始主动获取锁......
Thread-0获取到锁!
Thread-0出错了!!!
Thread-0释放锁!!
Thread-1还没有锁,开始主动获取锁......
Thread-1tName获取到锁!
Thread-1:0
Thread-1:1
Thread-1:2
Thread-1:3
Thread-1:4
Thread-1:5
Thread-1:6
Thread-1:7
Thread-1:8
Thread-1:9
Lock的lock()方法相关推荐
- Ubuntu中出现“Could not get lock /var/lib/dpkg/lock”的解决方法
Ubuntu中出现"Could not get lock /var/lib/dpkg/lock"的解决方法 参考文章: (1)Ubuntu中出现"Could not ge ...
- MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法
MySQL5.7报错[ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock的解决方法 参考文章: (1)MySQL5.7报错[ERROR ...
- 记一次MySQL中Waiting for table metadata lock的解决方法
记一次MySQL中Waiting for table metadata lock的解决方法 参考文章: (1)记一次MySQL中Waiting for table metadata lock的解决方法 ...
- Lock锁-------tryLock()方法
这一次主要学习Lock接口中的**tryLock()**方法. tryLock()方法是有返回值的,返回值是Boolean类型.它表示的是用来尝试获取锁:成功获取则返回true:获取失败则返回fals ...
- Lock锁的方法使用
文章目录 1 Lock 1.1 lock() 方法 1.2 tryLock()方法与 tryLock(long time, TimeUnit unit)方法 1.3 lockInterruptibly ...
- 使用synchronized实现Lock接口的lock和unlock方法
public class TestLock implements Lock {private Object lock = new Object();private long owner = -1;@O ...
- 转载 为什么不要 lock(this) ? lock object 并是readonly
转载地址http://blog.csdn.net/gulijiang2008/article/details/7257422 一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的 ...
- OpenWrt——Could not lock /var/lock/opkg.lock: Resource temporarily unavailable.
问题描述 root@OpenWrt:~# opkg update Collected errors:* opkg_conf_load: Could not lock /var/lock/opkg.lo ...
- Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
Mysql INNODB引擎行锁的3种算法 InnoDB存储引擎有3种行锁的算法,其分别是: □ Record Lock:单个行记录上的锁 Record Lock总是会去锁住索引记录,如果InnoDB ...
- Dumping all threads without appropriate locks held: thread list lock mutator lock报错原因?
以下报错是什么原因呢?跟了很久的代码,也没有找到具体原因 2021-07-16 16:30:15 07-16 16:30:15.825 11812 13216 I HwAudioRecordImpl: ...
最新文章
- 服务器信号为970101,cDIN_EN_ISO_306.970101精选.pdf
- Java第四次作业——面向对象高级特性(继承和多态)
- 不吹不擂,一文揭秘鸿蒙操作系统
- 这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!
- python验证码 识别代码不准_谈谈Python进行验证码识别的一些想法
- 如何向妻子解释OOD(转)
- 数学建模学习笔记(三)——插值算法
- hdu 4296 Buildings (贪心)
- Redis学习笔记(3)-XShell连接CentOSMini,并安装Redis
- oracle数据库使用
- 【转】高性能web开发
- criteria函数_1.2.21 EXCEL篇之函数篇-数学与三角函数1
- epoll + 非阻塞IO + openssl
- 【科创人独家】云风:从创业到招安,自由的游戏玩家+务实的程序员
- 有限域(2)——理想和商环
- 科沃斯机器人招股_科沃斯机器人首次公开发行A股股票的初步询价公告
- 【蓝桥杯-单片机学习笔记(三)】共阳数码管的静态显示
- seo日常工作表_SEO日常工作内容主要有哪些
- MATLAB中如何作随时间变化图
- 创建线程的三种方式、线程运行原理、常见方法、线程状态
热门文章
- guid mysql_关于MySQL:MySQL-如何搜索GUID
- jsp springmvc 视图解析器_Java面试题整理——SpringMVC
- poj 1386 Play on Words(有向图欧拉回路)
- 攻防世界-Web_php_include
- js post中文乱码 php,AJAX之POST数据中文乱码如何解决
- java期末考试2013及答案_java笔试经典(题及答案)2013.doc
- 一秒执行一次_《一秒钟》:一贯的粗旷式抓大放小,张艺谋的自命题作业总是要观众自己再做一遍...
- Java解决空引用_Java 匠人手法 - 优雅的处理空值
- python在浏览器运行一片空白_Webdriver启动Firefox浏览器后,页面显示空白
- python涉及到的逻辑_涉及逻辑运算的python表达式的运算顺序