面试题:Java对象的内存分配过程是如何保证线程安全的?

JAVA herman 81浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

有一个高级群,群里不少人的上进心都是非常强烈的。有时候,我会主动发一些面试题,会得到非常多的意想不到且完美的答案!

今天,我照例在群里发了一道面试题:Java对象的内存分配过程是如何保证线程安全的?不少人都回答正确了。

面试题:Java对象的内存分配过程是如何保证线程安全的?

我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,但是无论如何,对象在创建过程中,都需要进行内存分配。

对象的内存分配过程中,主要是对象的引用指向这个内存区域,然后进行初始化操作。

但是,因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,怎么办。

Java 对象的内存分配过程

为了解决这个并发问题,对象的内存分配过程就必须进行同步控制。但是我们都知道,无论是使用哪种同步方案(实际上虚拟机使用的可能是CAS),都会影响内存的分配效率。

而Java对象的分配是 Java 中的高频操作,所有,人们想到另外一个办法来提升效率。重点说一个 HotSpot 虚拟机的方案:

每个线程在 Java 堆中预先分配一小块内存,然后再给对象分配内存的时候,直接在自己这块”私有”内存中分配,当这部分区域用完之后,再分配新的”私有”内存。

这种方案被称之为 TLAB 分配,即 Thread Local Allocation Buffer。这部分 Buffer 是从堆中划分出来的,但是是本地线程独享的。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 面试题:Java对象的内存分配过程是如何保证线程安全的?