Java精通并发-Lock与synchronized关键字在底层的区别及实例分析
2024-10-21 05:15:35
在上两次中已经将Lock这个接口的整个官方说明进行了阅读,这次来了解一下它的一个非常重要的实现类:
啥叫“可重入”呢?其实是指一个线程已经拿到了锁,然后该线程还能再次获取这把锁,接下来在了解它之前先用一下该锁,如下:
然后接一来线程分别来调用定义的两个方法,如下:
下面来执行一下:
也就是线程交替地在执行,很容易理解,那如果下面修改一下代码:
那结果又是咋样呢?肯定会发生阻塞的情况,因为用了锁木有解锁嘛,运行一下:
也很好理解嘛,由于两个方法都要用同一个锁:
那当线程执行了myMethod1之后抢到锁就永远不会释放了,那myMethod2就永远获取不到了,则输出就可以预想了。接下来继续来改造一下程序:
此时当阻塞的时候我们可以用tryLock来判断出来实际状态,这样就不会一直尝试阻塞了,如果获取不了立马就返回然后程序就可以给出提示了。
以上是对于Lock的一个简单使用,下面咱们对Lock与synchronized关健字在锁的处理上的重要差别进行梳理一下:
1、锁的获取方法:前者是通过程序代码的方式由开发者手工获取,后者是通过JVM来获取(无需开发者干预)。
2、具体实现方法:前者是通过Java代码的方式来实现,后者是通过JVM底层来实现(无需开发者关注)。
3、锁的释放方法:前者务必通过unlock()方法在finally块中手工释放,后者是通过JVM来释放(无需开发者关注)。
4、锁的具体类型:前者提供了多种,如公平锁、非公平锁,后者与前者均提供了可重入锁。其中公平锁和非公平锁在ReentrantLock源码中看到身影:
最新文章
- 使用SignalR实现消息提醒
- android中webrtc的几个关键的状态
- 如何导入外部的源码到eclipse中
- python之pyqt4的简单窗口布局以及信号和槽(上代码)
- k短路模板 POJ2449
- FFmpeg源代码简单分析:avcodec_open2()
- Android特效专辑(八)——实现心型起泡飞舞的特效,让你的APP瞬间暖心
- JS响应数据
- ModuleNotFoundError: No module named 'video_back.urls'
- Spring Boot笔记九:AOP面向切面编程
- ivew实现table的编辑保存追加删除
- Puppet软件资源管理
- 用canvas画三角形的方法
- mysql数据库数据备份与恢复
- powerdesiner技巧
- Android中3种全屏方法及3种去掉标题栏的方法
- css 课堂笔记
- 蓝桥杯 地宫寻宝 DFS 动态规划
- ubuntu 添加CDROM安装源
- 建立链表的虚拟头结点 203 Remove Linked List Element,82,147,148,237
热门文章
- 远程windows
- C# 获取url中的查询字符串参数
- 【2019年05月21日】A股ROE最高排名
- centos7 安装hadoop2.7.6(分布式)
- python基础知识的学习和理解
- Python Web 之 Flask SQLalchemy
- TestNG系列(五)TestNG测试报告
- 获取html 中的内容 将前台的数据获取到后台 用 jquery 生成一个 form表单 提交数据
- asp.net core 系列之Reponse caching 之 Response Caching Middleware(4)
- linux环境:FTP服务器搭建