最近和同事交談详瑞,我問他們要不要寫博客,得到的答案大多都是不喜歡寫博客的這種方式粘我,其實也的確是這樣鼓蜒,每個人心中都有一桿秤,這桿秤不僅僅稱公理人心征字,也稱收益付出都弹,寫博客是一件很耗費時間的事,要查比較多的資料匙姜,也要了解足夠的知識畅厢。這其中的付出很難在短時間得到回報。而且每個人眼中的世界不一樣氮昧,也許你辛辛苦苦寫的博客框杜,也就是復(fù)制粘貼的cv處理而已,還是那句話袖肥,打井是靠一錘子一錘子打出來了咪辱,路是靠一步一步走出來的,做自己喜歡的事并且堅持下去椎组,結(jié)果一定是美麗的油狂。
這次講講對象的組成
學(xué)習(xí)就是對一件事情知其然知其所以然,想融匯貫通,就要窺其全貌专筷,java萬物街對象弱贼,那對象里面是啥呢
對象是由,對象頭仁堪,實例數(shù)據(jù)哮洽,及其填充組成的
運行下這段代碼
System.out.println(VM.current().details());
Object obj = new Object();
//獲取int類型二進(jìn)制的字符串表示
System.out.println(Integer.toBinaryString(obj.hashCode()));
//獲取int類型16進(jìn)制的字符串表示
System.out.println(obj + " 十六進(jìn)制哈希:" + Integer.toHexString(obj.hashCode()));
System.out.println(ClassLayout.parseInstance(obj).toPrintable());
輸出
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 01 c2 7b aa (00000001 11000010 01111011 10101010) (-1434729983)
4 4 (object header) 36 00 00 00 (00110110 00000000 00000000 00000000) (54)
8 4 (object header) 28 0f 8d 16 (00101000 00001111 10001101 00010110) (37834320
mark-word 中包含 Monitor 對象
8)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total
這里面就是對象的組成,因為對象沒有存儲數(shù)據(jù)所以能看到 一共16個字節(jié) 對象頭占了12填充占了4個弦聂,那為啥沒有實例數(shù)據(jù)呢鸟辅,因為這個對象并沒有放數(shù)據(jù)
那對象頭里面都有啥呢
mark-word 對象標(biāo)記對象 這里面存儲對象的hash碼 已經(jīng)輕量級鎖的標(biāo)記 和偏向鎖的標(biāo)記
Kclass Point class的類型指針 也就是存儲對象的內(nèi)存地址
其中 mark-word 里面有 Monitor對象
這對象比較關(guān)鍵,線程競爭同步鎖的時候莺葫,其實就是競爭這個對象匪凉,競爭到了就鎖定
ObjectMonitor() {
_header = NULL;
_count = 0; // 記錄個數(shù)
_waiters = 0,
_recursions = 0; // 線程重入次數(shù)
_object = NULL; // 存儲 Monitor 對象
_owner = NULL; // 持有當(dāng)前線程的 owner
_WaitSet = NULL; // 處于wait狀態(tài)的線程,會被加入到 _WaitSet
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ; // 單向列表
FreeNext = NULL ;
_EntryList = NULL ; // 處于等待鎖block狀態(tài)的線程捺檬,會被加入到該列表
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
_previous_owner_tid = 0;}
里面有count來記錄次數(shù)再层,從而判斷對象有沒有被線程競爭到。