JVM 里 new 对象时的线程安全问题

对象创建在虚拟机中是非常频繁的操作,即使仅仅修改一个指针所指向的位置,在并发情况下也会引起线程不安全。

解决线程安全问题有两种方案:

  • 采用CAS分配重试的方式来保证更新操作的原子性
  • 每个线程在Java堆中预先分配一小块内存,也就是本地线程分配缓冲(Thread Local AllocationBuffer,TLAB),要分配内存的线程,先在本地缓冲区中分配,只有本地缓冲区用完了,分配新的缓存区时才需要同步锁定。-XX:+UseTLAB

虚拟机1.8默认使用的是 TLAB 方式来进行内存分配的,如果想要使用CAS方式,可以通过设置 -XX:-UseTLAB 参数来关闭TLAB功能即可。默认情况下,TLAB 空间的内存非常小,仅占有整个 Eden 空间的 1%,我们可以通过 -XX:TLABWasteTargetPercent 设置 TLAB 空间所占用 Eden 空间的百分比大小。如果通过TLAB分配失败的时候,则会回到Eden区通过 CAS 方式进行分配。

相关推荐
文丑颜不良啊20 小时前
LeetCode1961~1980题目解析
java·leetcode
文丑颜不良啊20 小时前
LeetCode2001~2020题目解析
java·leetcode
用户37215742613520 小时前
Java 批量提取 Word 文档中的图片并保存到本地
java
SL_staff20 小时前
BI项目失败率90%?JVS如何用三阶闭环构建可落地的数据生产力平台
java·开源·全栈
nice_lcj5201 天前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐1 天前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
秋天的怀念_David1 天前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
灿飞1 天前
Kotlin与Java虚拟机八:控制流与 when:卫语句、上下文相关解析与穷尽性
java·kotlin
文丑颜不良啊1 天前
LeetCode2021~2040题目解析
java·leetcode
bksczm1 天前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库