Object o = new Object()在内存中占几个字节
生活随笔
收集整理的這篇文章主要介紹了
Object o = new Object()在内存中占几个字节
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
CAS:
Compare and Swap,即比較再交換。
jdk5增加了并發(fā)包java.util.concurrent.*,其下面的類使用CAS算法實(shí)現(xiàn)了區(qū)別于synchronouse同步鎖的一種樂觀鎖。JDK 5之前Java語言是靠synchronized關(guān)鍵字保證同步的,這是一種獨(dú)占鎖,也是是悲觀鎖。
?
?
?
?CAS算法理解
對CAS的理解,CAS是一種無鎖算法,CAS有3個操作數(shù),內(nèi)存值V,舊的預(yù)期值A(chǔ),要修改的新值B。當(dāng)且僅當(dāng)預(yù)期值A(chǔ)和內(nèi)存值V相同時(shí),將內(nèi)存值V修改為B,否則什么都不做.
?
查看對象在內(nèi)存中的布局:
引入依賴
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.10</version></dependency>?
?
對象在內(nèi)存中的布共分為四部分:
?
?
對象在內(nèi)存中的布共分為四部分:
Markword:主要存儲鎖的信息和GC的信息,占8個字節(jié)
類型指針class pointer :指向這個類在內(nèi)存中的Class對象,占4個字節(jié)
實(shí)例數(shù)據(jù) instance data : 這個類中實(shí)例對象所占的內(nèi)存,如果int a 則占4個字節(jié),如果時(shí)long b,則占8個字節(jié)
對齊padding:如果前邊幾個加起來的字節(jié)數(shù)不是8的整數(shù)倍,則填充補(bǔ)齊
所以O(shè)bject o = new Object();在內(nèi)存中共占用8+4+0+4共16個字節(jié)
?
?
?
?
?
?
鎖的升級:鎖的信息記錄在markword中.-
Object o = new Object();在對象剛剛被new出來時(shí),沒有加任何鎖.用markdown中最低三位代表鎖狀態(tài),其中一位是偏向鎖位,兩位是鎖標(biāo)志位
-
此時(shí)線程A訪問該對象,因?yàn)锳是第一個訪問該對象的線程,此時(shí)沒有其它線程競爭,o的markword的前54位指向了當(dāng)前線程,此時(shí)為偏向鎖.
-
當(dāng)線程A添加了偏向鎖之后,線程B也來訪問o對象,A,B兩個線程競爭.這兩個線程分別在各自的線程棧中生成一個Lock Record,以CAS的方式對o競爭加鎖,假設(shè)A成功,則o的markword指向線程A的Lock Record,線程B處于自旋狀態(tài).此時(shí)o上添加的是輕量級鎖也叫自旋鎖,也叫無鎖.
-
當(dāng)線程B自選次數(shù)超過10次,則向操作系統(tǒng)內(nèi)核態(tài)申請重量級鎖資源
?
?
總結(jié)
以上是生活随笔為你收集整理的Object o = new Object()在内存中占几个字节的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ1226 SDOI2009学校食
- 下一篇: 锁升级过程