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 方式进行分配。

相关推荐
2301_80387561几秒前
如何高效实现多用户通知系统而不造成数据库冗余
jvm·数据库·python
weixin_580614001 分钟前
SQL如何统计分组内的最高和最低值_MAX与MIN聚合应用
jvm·数据库·python
莫逸风3 分钟前
【java-core-collections】红黑树深度解析
java·开发语言
李少兄4 分钟前
Fastjson2 处理 JSON 字段大小写不一致的优雅方案
java·json
baidu_340998824 分钟前
JavaScript中函数调用的四种模式及其this绑定优先级表
jvm·数据库·python
吕源林5 分钟前
SQL在JOIN语句中过滤非必要字段_减少传输开销与查询执行时间
jvm·数据库·python
计算机毕业设计指导6 分钟前
基于SpringBoot+Vue3的荣成市健康管理平台设计与实现
java·spring boot·后端
qq_424098568 分钟前
如何在 Go 方法中正确修改切片类型
jvm·数据库·python
qq_3345635510 分钟前
如何利用分区进行并行DML_开启会话并行针对不同分区同时执行更新
jvm·数据库·python
渔民小镇11 分钟前
5 分钟搭建桌游服务器:Room 模块 + 领域事件实战
java·运维·服务器·分布式·游戏