在上两次中已经将Lock这个接口的整个官方说明进行了阅读,这次来了解一下它的一个非常重要的实现类:

啥叫“可重入”呢?其实是指一个线程已经拿到了锁,然后该线程还能再次获取这把锁,接下来在了解它之前先用一下该锁,如下:

然后接一来线程分别来调用定义的两个方法,如下:

下面来执行一下:

也就是线程交替地在执行,很容易理解,那如果下面修改一下代码:

那结果又是咋样呢?肯定会发生阻塞的情况,因为用了锁木有解锁嘛,运行一下:

也很好理解嘛,由于两个方法都要用同一个锁:

那当线程执行了myMethod1之后抢到锁就永远不会释放了,那myMethod2就永远获取不到了,则输出就可以预想了。接下来继续来改造一下程序:

此时当阻塞的时候我们可以用tryLock来判断出来实际状态,这样就不会一直尝试阻塞了,如果获取不了立马就返回然后程序就可以给出提示了。

以上是对于Lock的一个简单使用,下面咱们对Lock与synchronized关健字在锁的处理上的重要差别进行梳理一下:

1、锁的获取方法:前者是通过程序代码的方式由开发者手工获取,后者是通过JVM来获取(无需开发者干预)。

2、具体实现方法:前者是通过Java代码的方式来实现,后者是通过JVM底层来实现(无需开发者关注)。

3、锁的释放方法:前者务必通过unlock()方法在finally块中手工释放,后者是通过JVM来释放(无需开发者关注)。

4、锁的具体类型:前者提供了多种,如公平锁、非公平锁,后者与前者均提供了可重入锁。其中公平锁和非公平锁在ReentrantLock源码中看到身影:

最新文章

  1. 使用SignalR实现消息提醒
  2. android中webrtc的几个关键的状态
  3. 如何导入外部的源码到eclipse中
  4. python之pyqt4的简单窗口布局以及信号和槽(上代码)
  5. k短路模板 POJ2449
  6. FFmpeg源代码简单分析:avcodec_open2()
  7. Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心
  8. JS响应数据
  9. ModuleNotFoundError: No module named 'video_back.urls'
  10. Spring Boot笔记九:AOP面向切面编程
  11. ivew实现table的编辑保存追加删除
  12. Puppet软件资源管理
  13. 用canvas画三角形的方法
  14. mysql数据库数据备份与恢复
  15. powerdesiner技巧
  16. Android中3种全屏方法及3种去掉标题栏的方法
  17. css 课堂笔记
  18. 蓝桥杯 地宫寻宝 DFS 动态规划
  19. ubuntu 添加CDROM安装源
  20. 建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237

热门文章

  1. 远程windows
  2. C# 获取url中的查询字符串参数
  3. 【2019年05月21日】A股ROE最高排名
  4. centos7 安装hadoop2.7.6(分布式)
  5. python基础知识的学习和理解
  6. Python Web 之 Flask SQLalchemy
  7. TestNG系列(五)TestNG测试报告
  8. 获取html 中的内容 将前台的数据获取到后台 用 jquery 生成一个 form表单 提交数据
  9. asp.net core 系列之Reponse caching 之 Response Caching Middleware(4)
  10. linux环境:FTP服务器搭建