解释悲观锁与乐观锁

简介: 悲观锁如synchronized,假定竞争总会发生,通过互斥保证线程安全,失败则阻塞;乐观锁如AtomicInteger,假定竞争少,不加锁,失败后重试。适用于低争用场景。二者核心在于对并发冲突的预期不同,思想广泛用于Java及数据库等领域。

悲观锁

  • 像 synchronized,Lock 这些都属于悲观锁
  • 如果发生了竞争,失败的线程会进入阻塞
  • 【理解】悲观的名字由来:害怕其他线程来同时修改共享资源,因此用互斥锁让同一时刻只能有一个线程来占用共享资源

乐观锁

  • 像 AtomicInteger,AtomicReference 等原子类,这些都属于乐观锁
  • 如果发生了竞争,失败的线程不会阻塞,仍然会重试
  • 【理解】乐观的名字由来:不怕其他线程来同时修改共享资源,事实上它根本不加锁,所有线程都可以去修改共享资源,只不过并发时只有一个线程能成功,其它线程发现自己失败了,就去重试,直至成功

适用场景

  • 如果竞争少,能很快占有共享资源,适合使用乐观锁
  • 如果竞争多,线程对共享资源的独占时间长,适合使用悲观锁

P.S.

  • 这里讨论 Java 中的悲观锁和乐观锁,其它领域如数据库也有这俩概念,当然思想是类似的
相关文章
|
JSON Dubbo 测试技术
逐步教你如何在Postman中导入Swagger API
在现代软件开发中,Swagger 和 Postman 作为 API 设计、开发和测试的利器,都被广泛应用。可以将 Swagger 定义的 API 导入到 Postman 中,充分利用 Postman 强大的测试特性对接口进行深入测试。
|
9月前
|
SQL 运维 关系型数据库
com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'balance' at row 1
本文通过实际案例解析MySQL中余额字段因超出decimal(10,2)范围触发的数据截断错误,分析报错原因、复现问题并提出字段扩容至decimal(20,2)的解决方案,总结了金融系统中数值字段设计不当带来的风险及预防措施。
|
9月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实战步骤,涵盖配置管理、热更新、共享配置优先级及集群搭建,帮助微服务应用实现配置动态化、高可用部署。
516 4
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
9月前
|
负载均衡 Java Nacos
Gateway服务网关
网关是微服务架构的统一入口,实现请求路由、权限控制、限流及负载均衡。SpringCloud Gateway基于WebFlux,性能优于Zuul。支持断言与过滤器工厂,可自定义全局过滤器,解决跨域等问题,是微服务流量管控的核心组件。
479 0
|
9月前
|
Java 关系型数据库 Docker
Docker + Spring Boot:天生一对的完美部署
使用Docker部署Spring Boot项目能极大简化环境配置和应用分发。要将Spring Boot项目部署到Docker,主要流程是:准备项目、创建Docker镜像、运行Docker容器。
560 0
|
安全 Java 编译器
HashMap, HashTable, ConcurrentHashMap 之间的区别
HashMap, HashTable, ConcurrentHashMap 之间的区别
640 0
|
监控 Java Linux
Java程序性能分析:内存
开发Java项目过程中,难免会碰到一些 性能 问题,这时候就需要一些工具,帮忙排查。本文主要介绍 JDK自带的上古神器 jstat、jmap,另简单介绍 MAT、gceasy、HeapDump 等
1405 5
|
数据采集 SEO
动态代理IP和静态代理,到底有什么区别?
静态代理IP提供固定IP,适用于长期稳定连接,如服务器管理和账户维护,具有较高稳定性和安全性。动态代理IP则会定期更换IP,适合网络爬虫和需要模拟全球用户行为的场景,提供灵活性和广泛覆盖。选择代理IP应根据业务需求、预算和法规要求,确保合法合规使用。
|
监控 小程序 Java
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
1340 0
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理

热门文章

最新文章