併發程式設計 鎖膨脹(預備知識)

2021-10-18 10:32:51 字數 4566 閱讀 6986

此篇內容需要物件頭的知識,可檢視文章 

目錄

併發程式設計之鎖膨脹預備知識

一、無鎖

二、輕量鎖

三、header header = new header();

四、執行緒加鎖synchronized

五、執行緒釋放鎖(四中的t1釋放鎖)

無鎖分為兩種情況。

無鎖可偏向(101)

無鎖不可偏向(001)。在無鎖不可偏向的情況下第一位偏向標識「0」表示不可偏向。但是還有一種情況也是101這種情況,那就是有鎖且鎖已經偏向了執行緒。

所以,看一把鎖(物件)是否有鎖,不能單純看後三位,如果後三位是101,它可能是有鎖,也可能是無鎖。但是後三位如果是001那麼肯定是無鎖的,所以以後說的無鎖基本都是指001.

後兩位是00(一共是64位,前兩62位都是乙個指標,所以輕量級鎖只需要看後兩位00)

乙個物件new出來的時候是無鎖可偏向的也就是後三位是101,其物件頭的結構如下:其中bl=1,lock=01

----------------------列印結果------------------

18:46:57.162 [main] info com.example.thread.testdemo - com.example.thread.header object internals:

offset size type description value

0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)

4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)

8 4 (object header) 95 ef 00 f8 (10010101 11101111 00000000 11111000) (-134156395)

12 4 (loss due to the next object alignment)

instance size: 16 bytes

space losses: 0 bytes internal + 4 bytes external = 4 bytes total

結果分析:新建物件的物件頭為101,其他位均為0

*/使用乙個執行緒t1來加鎖synchronized,那麼它必然是乙個偏向鎖,後三位同樣是101,但是前面的值變了;儲存了執行緒id和epoch等值,如下圖:其中bl=1,lock=01(和3不同的是前面的值變了)

----------------------列印結果----------------------

18:56:41.343 [main] info com.example.thread.testdemo - 新建物件

# warning: unable to attach serviceability agent. you can try again with escalated privileges. two options: a) use -djol.trywithsudo=true to try with sudo; b) echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

18:56:42.078 [main] info com.example.thread.testdemo - com.example.thread.header object internals:

offset size type description value

0 4 (object header) 05 00 00 00 (00000101 00000000 00000000 00000000) (5)

4 4 (object header) 00 00 00 00 (00000000 00000000 00000000 00000000) (0)

8 4 (object header) 95 ef 00 f8 (10010101 11101111 00000000 11111000) (-134156395)

12 4 (loss due to the next object alignment)

instance size: 16 bytes

space losses: 0 bytes internal + 4 bytes external = 4 bytes total

18:56:42.079 [thread1] info com.example.thread.testdemo - name :thread1

18:56:42.080 [thread1] info com.example.thread.testdemo - com.example.thread.header object internals:

offset size type description value

0 4 (object header) 05 70 2b 0b (00000101 01110000 00101011 00001011) (187396101)

4 4 (object header) f5 7f 00 00 (11110101 01111111 00000000 00000000) (32757)

8 4 (object header) 95 ef 00 f8 (10010101 11101111 00000000 11111000) (-134156395)

12 4 (loss due to the next object alignment)

instance size: 16 bytes

space losses: 0 bytes internal + 4 bytes external = 4 bytes total

18:56:42.579 [main] info com.example.thread.testdemo - 釋放鎖之後

18:56:42.580 [main] info com.example.thread.testdemo - com.example.thread.header object internals:

offset size type description value

0 4 (object header) 05 70 2b 0b (00000101 01110000 00101011 00001011) (187396101)

4 4 (object header) f5 7f 00 00 (11110101 01111111 00000000 00000000) (32757)

8 4 (object header) 95 ef 00 f8 (10010101 11101111 00000000 11111000) (-134156395)

12 4 (loss due to the next object alignment)

instance size: 16 bytes

space losses: 0 bytes internal + 4 bytes external = 4 bytes total

結果分析:執行緒t1使用synchronized加鎖的物件頭結構還是101,只是前面的值變了。

*/t1將鎖釋放(僅有t1加鎖),由於鎖是偏向鎖,所以就算是釋放了鎖還是101,物件頭和四中的一樣。在四中的**列印結果中也可以看見。

執行緒 鎖 預備知識

核心數和執行緒數是一比一的關係 使用了超執行緒技術後核心數 執行緒數變為 1 2的關係 為什麼我們開發的時候允許很多執行緒同時跑呢?就是因為cpu時間片輪轉機制,也叫rr排程。它給每個執行緒分配乙個時間段,當它時間段結束後,它就切換到其它的執行緒執行,如果在時間段內就執行完,那麼直接切換到其它執行緒...

C語言程式設計預備知識

1.cpu 記憶體條 硬碟 主機板 顯示器 之間的關係 2.holloworld程式如何執行起來的 3.資料型別 1.基本型別 整數整型 int 4位元組 短整型 short int 2位元組 長整型 long int 8位元組 includeint main void 浮點數 實數 單精度浮點數 ...

iOS併發程式設計 鎖

import import import import define iterations 1024 1024 32 void testlock now cfabsolutetimegetcurrent printf nslock f sec n now then then cfabsoluteti...