Synchronized 和 ReentrantLock (Lock )的区别
2024-10-09 03:51:29
- 原始构成
- Synchronized 是关键字,属于JVM层面,底层是通过 monitorenter 和 monitorexit 完成,依赖于 monitor 对象来完成。由于 wait/notify 方法也依赖于 monitor 对象,因此只有在同步块或方法中才能调用这些方法。
- Lock 是 java.util.concurrent.locks.lock 包下的,是 api层面的锁。
- 使用方法
- Synchronized 不需要用户手动释放锁,代码完成之后系统自动让线程释放锁
- ReentrantLock 需要用户手动释放锁,没有手动释放可能导致死锁。
- 等待是否可以中断
- Synchronized 不可中断,除非抛出异常或者正常运行完成
- ReentrantLock 可以中断。一种是通过
tryLock(long timeout, TimeUnit unit)
,另一种是lockInterruptibly()
放代码块中,调用interrupt()
方法进行中断。
- 加锁是否公平
- synchronized 是非公平锁
- ReentrantLock 默认非公平锁,可以在构造方法传入 boolean 值,true 代表公平锁,false 代表非公平锁。
- 锁绑定多个 Condition
- Synchronized 只有一个阻塞队列,只能随机唤醒一个线程或者唤醒全部线程。
- ReentrantLock 用来实现分组唤醒,可以精确唤醒。
最新文章
- iOS Interface Builder:在.xib文件中加载另一个.xib文件
- Java Garbage Collection基础详解------Java 垃圾回收机制技术详解
- kali 虚拟机开启mysql:3306 供主机访问.
- 项目前端技术-learn
- ConfigParser---python
- Javascript:简单拖拽效果的实现
- 无法从带有索引像素格式的图像创建graphics对象(转)
- 傻瓜式破解linux--rootpassword
- 【Time系列四】查询各月份的日历
- VMware设置NAT网络
- 安装mongodb后启动报错libstdc++
- CISCO ACL配置
- echarts修改上下左右的边距
- exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
- Android View体系(五)从源码解析View的事件分发机制
- android.DataBindingUtil
- PySide图形界面开发(一)
- 使用Linux工作之Fedora KDE
- 斐波拉契数列(用JavaScript和Python实现)
- spring mvc 工作原理
热门文章
- XFS文件系统的备份与恢复
- commonJS、AMD和CMD之间的区别
- L12 Transformer
- 杭电1080 J - Human Gene Functions
- 14.移动端图片浏览组件 react-wx-images-viewer
- pytorch seq2seq模型中加入teacher_forcing机制
- Centos8安装docker-compose
- thinkphp5 不使用form,用input+ajax异步上传图片
- 2019-2020-1 20199310《Linux内核原理与分析》第一周作业
- Scala教程之:面向对象的scala