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

相关推荐
程序员清风13 分钟前
跳表的原理和时间复杂度,为什么还需要字典结构配合?
java·后端·面试
渣哥26 分钟前
Kafka消息丢失的3种场景,生产环境千万要注意
java
渣哥27 分钟前
ElasticSearch深度分页的致命缺陷,千万数据查询秒变蜗牛
java
Olrookie27 分钟前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
长臂人猿29 分钟前
JVM常用工具:jstat、jmap、jstack
linux·运维·jvm
柯南二号44 分钟前
【Java后端】MyBatis-Plus 原理解析
java·开发语言·mybatis
又是努力搬砖的一年1 小时前
SpringBoot中,接口加解密
java·spring boot·后端
:-)1 小时前
idea配置maven国内镜像
java·ide·maven·intellij-idea
柠檬味的薄荷心1 小时前
【C#补全计划】多线程
jvm
我是哈哈hh1 小时前
【Node.js】ECMAScript标准 以及 npm安装
开发语言·前端·javascript·node.js