ReentrantLock是JDK唯一实现了Lock接口的

lock()

是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。
由于在前面讲到如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。

实例

各自独立的Lock对象

两个线程的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()方法相关推荐

  1. Ubuntu中出现“Could not get lock /var/lib/dpkg/lock”的解决方法

    Ubuntu中出现"Could not get lock /var/lib/dpkg/lock"的解决方法 参考文章: (1)Ubuntu中出现"Could not ge ...

  2. 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 ...

  3. 记一次MySQL中Waiting for table metadata lock的解决方法

    记一次MySQL中Waiting for table metadata lock的解决方法 参考文章: (1)记一次MySQL中Waiting for table metadata lock的解决方法 ...

  4. Lock锁-------tryLock()方法

    这一次主要学习Lock接口中的**tryLock()**方法. tryLock()方法是有返回值的,返回值是Boolean类型.它表示的是用来尝试获取锁:成功获取则返回true:获取失败则返回fals ...

  5. Lock锁的方法使用

    文章目录 1 Lock 1.1 lock() 方法 1.2 tryLock()方法与 tryLock(long time, TimeUnit unit)方法 1.3 lockInterruptibly ...

  6. 使用synchronized实现Lock接口的lock和unlock方法

    public class TestLock implements Lock {private Object lock = new Object();private long owner = -1;@O ...

  7. 转载 为什么不要 lock(this) ? lock object 并是readonly

    转载地址http://blog.csdn.net/gulijiang2008/article/details/7257422 一. 为什么要lock,lock了什么? 当我们使用线程的时候,效率最高的 ...

  8. 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 ...

  9. Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock

    Mysql INNODB引擎行锁的3种算法 InnoDB存储引擎有3种行锁的算法,其分别是: □ Record Lock:单个行记录上的锁 Record Lock总是会去锁住索引记录,如果InnoDB ...

  10. 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: ...

最新文章

  1. 服务器信号为970101,cDIN_EN_ISO_306.970101精选.pdf
  2. Java第四次作业——面向对象高级特性(继承和多态)
  3. 不吹不擂,一文揭秘鸿蒙操作系统
  4. 这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!
  5. python验证码 识别代码不准_谈谈Python进行验证码识别的一些想法
  6. 如何向妻子解释OOD(转)
  7. 数学建模学习笔记(三)——插值算法
  8. hdu 4296 Buildings (贪心)
  9. Redis学习笔记(3)-XShell连接CentOSMini,并安装Redis
  10. oracle数据库使用
  11. 【转】高性能web开发
  12. criteria函数_1.2.21 EXCEL篇之函数篇-数学与三角函数1
  13. epoll + 非阻塞IO + openssl
  14. 【科创人独家】云风:从创业到招安,自由的游戏玩家+务实的程序员
  15. 有限域(2)——理想和商环
  16. 科沃斯机器人招股_科沃斯机器人首次公开发行A股股票的初步询价公告
  17. 【蓝桥杯-单片机学习笔记(三)】共阳数码管的静态显示
  18. seo日常工作表_SEO日常工作内容主要有哪些
  19. MATLAB中如何作随时间变化图
  20. 创建线程的三种方式、线程运行原理、常见方法、线程状态

热门文章

  1. guid mysql_关于MySQL:MySQL-如何搜索GUID
  2. jsp springmvc 视图解析器_Java面试题整理——SpringMVC
  3. poj 1386 Play on Words(有向图欧拉回路)
  4. 攻防世界-Web_php_include
  5. js post中文乱码 php,AJAX之POST数据中文乱码如何解决
  6. java期末考试2013及答案_java笔试经典(题及答案)2013.doc
  7. 一秒执行一次_《一秒钟》:一贯的粗旷式抓大放小,张艺谋的自命题作业总是要观众自己再做一遍...
  8. Java解决空引用_Java 匠人手法 - 优雅的处理空值
  9. python在浏览器运行一片空白_Webdriver启动Firefox浏览器后,页面显示空白
  10. python涉及到的逻辑_涉及逻辑运算的python表达式的运算顺序