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

【学习笔记】深入理解Java虚拟机学习笔记——第13章 线程安全与锁优化

第13章 线程安全与锁优化

13.1 概述

13.2 线程安全

13.2.1 Java语言中的线程安全

1>不可变
final修饰的变量,及string、枚举类、Big Integer等不可修改对象
2>绝对线程安全
需维护快照等手段来保证线程绝对安全(包括循环)
3>相对线程安全
Java线程安全类大多为这个级别,只保证单次操作线程安全
4>线程兼容
Java API大多为线程兼容,Arraylist、HashMap等都需要在调用端实现线程安全
5>线程对立
调用时不管是否采取同步措施,都无法同步。

13.2.2 线程安全的实现方法

1>互斥同步
synchronized、lock(一个自旋、其余阻塞)时至今日,性能已相差不大。
2>非阻塞同步
CAS
3>无同步方案
一个请求对应一个线程的servlet API,就无需考虑线程同步问题,因为不与其他线程分享变量

13.3 锁优化

1>自旋
消耗处理器资源,但减少上下文切换,适合短时间获取到锁。
2>锁消除
操作对象不逃逸到方法及线程外的,可以不使用锁
3>锁粗化
在一段代码中不停加锁解锁,不如一次性先加最后再解,避免多次加解锁消耗

13.3.4 轻量级锁

CAS来获取锁,如果失败,且不是自己持有锁,则发生锁竞争,有竞争则变为重量级锁。

13.3.5 偏向锁

轻量级锁用CAS代替互斥量,而偏向锁使用无锁,如果一个线程反复持有锁,则干脆不加锁。
【如果大部分时间并发严重,那么偏向锁很多余,反而会影响性能】

相关文章:

  • 力扣网C语言编程题:在数组中查找目标值位置之二分查找法
  • Vue.js 中的数字格式化组件:`FormattedNumber`
  • C++ STL深度剖析:Stack、queue、deque容器适配器核心接口
  • LLM 安全防护解决方案,使用 Roberta 训练 LLM 提示词注入攻击判决模型
  • 案例开发 - 日程管理系统 - 第一期
  • Hadoop集群异常:两个NameNode全部为StandBy状态
  • uniapp image引用本地图片不显示问题
  • Centos 8设置固定IP
  • AlphaGenome:基因组学领域的人工智能革命
  • 【C++进阶】--- 继承
  • pytest 中的重试机制
  • 深入详解:决策树算法的概念、原理、实现与应用场景
  • 数据库(MYsql)
  • 可编程逻辑器件的演进与对比分析
  • Flutter基础(Future和async/await)
  • 地平线静态目标检测 MapTR 参考算法 - V2.0
  • 创客匠人解析:身心灵赛道创始人 IP 打造核心策略
  • 《剖开WebAssembly 2.0:C++/Rust内存管理困局与破局》
  • 网关ARP防护的措施
  • 实变与泛函题解-心得笔记【15】