有一个高级群,群里不少人的上进心都是非常强烈的。有时候,我会主动发一些面试题,会得到非常多的意想不到且完美的答案!
今天,我照例在群里发了一道面试题:Java对象的内存分配过程是如何保证线程安全的?不少人都回答正确了。
我们知道,Java是一门面向对象的语言,我们在Java中使用的对象都需要被创建出来,在Java中,创建一个对象的方法有很多种,但是无论如何,对象在创建过程中,都需要进行内存分配。
对象的内存分配过程中,主要是对象的引用指向这个内存区域,然后进行初始化操作。
但是,因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,怎么办。
为了解决这个并发问题,对象的内存分配过程就必须进行同步控制。但是我们都知道,无论是使用哪种同步方案(实际上虚拟机使用的可能是CAS),都会影响内存的分配效率。
而Java对象的分配是 Java 中的高频操作,所有,人们想到另外一个办法来提升效率。重点说一个 HotSpot 虚拟机的方案:
每个线程在 Java 堆中预先分配一小块内存,然后再给对象分配内存的时候,直接在自己这块”私有”内存中分配,当这部分区域用完之后,再分配新的”私有”内存。
这种方案被称之为 TLAB 分配,即 Thread Local Allocation Buffer。这部分 Buffer 是从堆中划分出来的,但是是本地线程独享的。
: » 面试题:Java对象的内存分配过程是如何保证线程安全的?
原创文章,作者:dweifng,如若转载,请注明出处:https://blog.ytso.com/252212.html