当前位置: 首页 > news >正文

synchronized和Lock的区别

synchronized和lock的区别

synchronized和Lock,我已经通过源码级别的介绍过了,下面我们来总结下他们的区别

区别:

1.synchronized是关键字,Lock是接口,synchronized是JVM层实现,Lock是JDK中JUC包下的实现;

2.synchronized是隐式的加锁,lock是显式的加锁;

3.synchronized可以作用于方法上,lock只能作用于方法块;

4.synchronized底层采用的是objectMonitor,lock采用的AQS;

5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁, 支持超时时间的加锁;

6.synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列;

7.synchronized只支持非公平锁,lock支持非公平锁和公平锁;

8.synchronized使用了object类的wait和notify进行等待和唤醒, lock使用了condition接口进行等待和唤醒(await和signal);

9.lock支持个性化定制, 使用了模板方法模式,可以自行实现lock方法;
10. synchronized在发生异常和同步块结束的时候,会自动释放锁。而Lock必须手动释放, 所以如果忘记了释放锁,一样会造成死锁。

相同点:

1.Lock是一个接口,为了使用一个Lock对象,需要用到;

2.Lock lock = new ReentrantLock();

3.与 synchronized (someObject) 类似的,lock()方法,表示当前线程占用lock对象,一旦占用,其他线程就不能占用了;

4.与synchronized 不同的是,一旦synchronized 块结束,就会自动释放对someObject的占用。 lock却必须调用unlock方法进行手动释放,为了保证释放的执行,往往会把unlock() 放在finally中进行;

5.synchronized 是不占用到手不罢休的,会一直试图占用下去;

6.与 synchronized 的钻牛角尖不一样,Lock接口还提供了一个trylock方法;

7.trylock会在指定时间范围内试图占用。 如果时间到了,还占用不成功,就选择放弃;

注意: 因为使用trylock有可能成功,有可能失败,所以后面unlock释放锁的时候,需要判断是否占用成功了,如果没占用成功也unlock,就会抛出异常;

8.使用synchronized方式进行线程交互,用到的是同步对象的wait,notify和notifyAll方法;

9.Lock也提供了类似的解决办法,首先通过lock对象得到一个Condition对象,然后分别调用这个Condition对象的:await, signal,signalAll 方法;

注意: 不是Condition对象的wait,nofity,notifyAll方法,是await,signal,signalAll;

参考

史上最详细JUC教程之Synchronized与锁升级详解
谈谈Java多线程离不开的AQS

http://www.lryc.cn/news/7125.html

相关文章:

  • SpringBoot 指标监控 Actuator
  • 面试浅谈之十大排序算法
  • LeetCode-1250. 检查「好数组」【数论,裴蜀定理】
  • 【Linux】NTP时间同步服务与NFS网络文件共享存储服务器(配置、测试)
  • windows下php连接oracle安装oci8扩展报错(PHP Startup: Unable to load dynamic library ‘oci8_11g‘)
  • TensorRT的功能
  • 433MHz无线通信--模块RXB90
  • Seata源码学习(三)-2PC核心源码解读
  • IO流概述
  • 【node.js】node.js的安装和配置
  • Python优化算法—遗传算法
  • 数据埋点(Data buried point)的应用价值剖析
  • 一文弄懂硬链接、软链接、复制的区别
  • 界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!
  • 在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录
  • 2023爱分析 · 数据科学与机器学习平台厂商全景报告 | 爱分析报告
  • 20230215_数据库过程_高质量发展
  • 【百度 JavaScript API v3.0】LocalSearch 位置检索、Autocomplete 结果提示
  • 运用Facebook投放,如何制定有效的竞价策略?
  • 大数据框架之Hadoop:HDFS(五)NameNode和SecondaryNameNode(面试开发重点)
  • 计算机网络 - 1. 体系结构
  • 银行业上云进行时,OLAP 云服务如何解决传统数仓之痛?
  • 特定领域知识图谱融合方案:文本匹配算法之预训练Simbert、ERNIE-Gram单塔模型等诸多模型【三】
  • 【2023最新教程】从0到1开发自动化测试框架(0基础也能看懂)
  • linux备份命令小记 —— 筑梦之路
  • vue项目(vue-cli)配置环境变量和打包时区分开发、测试、生产环境
  • Python 命名规范
  • 操作系统——2.操作系统的特征
  • 【计算机网络期末复习】第六章 应用层
  • TypeScript基本教程