本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
![视频教程免费领](https://cdn.jsdelivr.net/gh/xmt1139057136/xttblog/2022/03/1648866767704.jpg)
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
有一个高级群,群里不少人的上进心都是非常强烈的。有时候,我会主动发一些面试题,会得到非常多的意想不到且完美的答案!
今天,我照例在群里发了一道面试题:Java对象的内存分配过程是如何保证线程安全的?不少人都回答正确了。
![](https://gitee.com/xmtblog/img/raw/master/WX20200310-180801.png)
我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,但是无论如何,对象在创建过程中,都需要进行内存分配。
对象的内存分配过程中,主要是对象的引用指向这个内存区域,然后进行初始化操作。
但是,因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,怎么办。
![](https://gitee.com/xmtblog/img/raw/master/WX20200310-181258.png)
为了解决这个并发问题,对象的内存分配过程就必须进行同步控制。但是我们都知道,无论是使用哪种同步方案(实际上虚拟机使用的可能是CAS),都会影响内存的分配效率。
而Java对象的分配是 Java 中的高频操作,所有,人们想到另外一个办法来提升效率。重点说一个 HotSpot 虚拟机的方案:
每个线程在 Java 堆中预先分配一小块内存,然后再给对象分配内存的时候,直接在自己这块”私有”内存中分配,当这部分区域用完之后,再分配新的”私有”内存。
这种方案被称之为 TLAB 分配,即 Thread Local Allocation Buffer。这部分 Buffer 是从堆中划分出来的,但是是本地线程独享的。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 面试题:Java对象的内存分配过程是如何保证线程安全的?