当前位置:网站首页>堆內存分配的並發問題

堆內存分配的並發問題

2022-06-24 22:27:00 Nice2cu_Code

在實際的開發過程中,會經常的創建對象,作為虛擬機,必須保證線程安全。通常來講虛擬機采用兩種方式保證線程安全

一、CAS + 失敗重試

CAS是一種樂觀鎖的實現方式,每次不加鎖假設沒有沖突的去完成某項操作,如果因為沖突導致操作失敗就重試,直到成功為止。詳見博客,傳送地址:Java並發編程之 無鎖(CAS)

二、TLAB

TLAB是在Java堆空間的伊甸園劃分出來的針對每個線程的內存空間,專門在該區域為該線程創建的對象分配內存。

它的主要目的是在並發環境下進行內存分配的時候,减少線程之間對於內存空間的競爭,加速內存分配的速度。

TLAB本質上還是在Java堆中的,所以在TLAB區域的對象,也可以被其他線程訪問。

如果沒有使用TLAB,多個並發執行的線程創建對象,分配內存的時候,有可能在Java堆中的同一個比特置申請,這就需要對這部分內存空間進行加鎖或者采用CAS等操作保證線程安全,即保證該區域只分配給一個線程。

使用了TLAB之後,JVM會針對每個線程在堆內存中預留一個內存區域,在預留這個操作發生的時候,需要進行加鎖或者采用CAS等操作進行保護,避免多個線程預留同一個區域。一旦確定了某個區域分配給某個線程,之後該線程需要分配內存的時候,會優先在這片區域申請。這個區域對於該線程分配內存這個操作而言是線程私有的,因此在分配的時候不用進行加鎖等操作,從而既保護了線程安全又提昇了分配速度。

注意: 當該線程創建的對象大於TLAB中的剩餘內存或者TLAB的內存已用盡時,再采用CAS + 失敗重試的方式分配內存。

原网站

版权声明
本文为[Nice2cu_Code]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/175/202206241615541818.html