๐Ÿ” ้”ๅ‡็บง่ฟ‡็จ‹๏ผšไปŽ"ไฝ›็ณป"ๅˆฐ"ๆšด่บ"็š„่œ•ๅ˜๏ผ

32 ้˜…่ฏป10ๅˆ†้’Ÿ

้ข่ฏ•่€ƒ็‚น๏ผšๅๅ‘้”ใ€่ฝป้‡็บง้”ใ€้‡้‡็บง้”็š„ๅ‡็บง่ฟ‡็จ‹ๅ’ŒMark Wordๅ˜ๅŒ–

้”็š„ไธ€็”Ÿ๏ผŒๅฐฑๅƒไบบ็š„ๆˆ้•ฟ๏ผš

ไฝ›็ณป้’ๅนด ๐Ÿง˜ โ†’ ่ฝปๅบฆ็„ฆ่™‘ ๐Ÿ˜ฐ โ†’ ๆšด่บ่€ๅ“ฅ ๐Ÿ˜ก
   โ†“            โ†“            โ†“
 ๅๅ‘้”      ่ฝป้‡็บง้”      ้‡้‡็บง้”

ไปŠๅคฉๅ’ฑไปฌๅฐฑๆฅ็œ‹็œ‹้”็š„**"ๆˆ้•ฟๅฒ"**๏ผ๐ŸŽ“

๐ŸŽฏ ไธบไป€ไนˆ้œ€่ฆ้”ๅ‡็บง๏ผŸ

่ƒŒๆ™ฏ๏ผšไผ ็ปŸ้‡้‡็บง้”็š„็—›็‚น ๐Ÿ’”

Java 1.5ไน‹ๅ‰๏ผšsynchronizedๅชๆœ‰้‡้‡็บง้”

ๆฏๆฌกๅŠ ้”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ็”จๆˆทๆ€ โ†’ ๅ†…ๆ ธๆ€ๅˆ‡ๆข  โฐ ๆ…ข๏ผ
2. ๆ“ไฝœ็ณป็ปŸไบ’ๆ–ฅ้‡      โฐ ๆ…ข๏ผ
3. ๅ†…ๆ ธๆ€ โ†’ ็”จๆˆทๆ€ๅˆ‡ๆข  โฐ ๆ…ข๏ผ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅณไฝฟ๏ผš
- ๆฒกๆœ‰็ซžไบ‰
- ๅชๆœ‰ไธ€ไธช็บฟ็จ‹่ฎฟ้—ฎ
- ไนŸ่ฆ่ตฐ่ฟ™ไธชๆต็จ‹๏ผ๐Ÿ˜ญ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

Java 6็š„้ฉๅ‘ฝ๏ผš้”ไผ˜ๅŒ– ๐ŸŽ‰

ๆ ธๅฟƒๆ€ๆƒณ๏ผšๅคง้ƒจๅˆ†ๆƒ…ๅ†ตไธ‹๏ผŒ้”ๆ˜ฏๆฒกๆœ‰็ซžไบ‰็š„๏ผ

็ปŸ่ฎกๆ•ฐๆฎ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
95%็š„้”๏ผšๅชๆœ‰ไธ€ไธช็บฟ็จ‹่ฎฟ้—ฎ  ๐Ÿง˜
4%็š„้”๏ผšๆœ‰็ซžไบ‰๏ผŒไฝ†ๅพˆ่ฝปๅพฎ    ๐Ÿ˜ฐ
1%็š„้”๏ผšๆฟ€็ƒˆ็ซžไบ‰            ๐Ÿ˜ก
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ไผ˜ๅŒ–็ญ–็•ฅ๏ผš
ๆ นๆฎ็ซžไบ‰็จ‹ๅบฆ๏ผŒๅŠจๆ€ๅ‡็บง้”๏ผ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ—๏ธ ้”็š„ๅ››็ง็Šถๆ€

ๆ— ้” โ†’ ๅๅ‘้” โ†’ ่ฝป้‡็บง้” โ†’ ้‡้‡็บง้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
็‰น็‚น๏ผš
โœ… ๅช่ƒฝๅ‡็บง๏ผŒไธ่ƒฝ้™็บง๏ผˆJDK 15ๅŽๅฏ้™็บง๏ผ‰
โœ… ๅ‡็บงๆ˜ฏ่‡ชๅŠจ็š„๏ผŒๆ— ้œ€ๆ‰‹ๅŠจ
โœ… ็Šถๆ€่ฎฐๅฝ•ๅœจๅฏน่ฑกๅคด๏ผˆMark Word๏ผ‰
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

็”Ÿๆดป็ฑปๆฏ” ๐Ÿ 

ๆ— ้”๏ผš
่‡ชๅทฑๅฎถ๏ผŒไธ็”จ้”้—จ ๐Ÿก

ๅๅ‘้”๏ผš
ๅชๆœ‰ไฝ ไฝ๏ผŒ้—จไธŠ่ดดไธชๅๅญ—๏ผŒ็›ดๆŽฅ่ฟ› ๐Ÿšช

่ฝป้‡็บง้”๏ผš
ๅถๅฐ”ๆœ‰ๅฎขไบบ๏ผŒๆ•ฒ้—จ็ญ‰ไธ€ไธ‹ ๐Ÿ””

้‡้‡็บง้”๏ผš
ๅพˆๅคšไบบๆŠขๆˆฟ้—ด๏ผŒๆ‰พไฟๅฎ‰็ฎก็† ๐Ÿ‘ฎ

๐Ÿ“ฆ ๅฏน่ฑกๅคดไธŽMark Word

ๅฏน่ฑกๅ†…ๅญ˜ๅธƒๅฑ€ ๐Ÿ—๏ธ

Javaๅฏน่ฑก = ๅฏน่ฑกๅคด + ๅฎžไพ‹ๆ•ฐๆฎ + ๅฏน้ฝๅกซๅ……
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚        ๅฏน่ฑกๅคด (Header)           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚ Mark Word (8ๅญ—่Š‚)        โ”‚ โ† ๅ…ณ้”ฎ๏ผ
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ Class Pointer (4/8ๅญ—่Š‚)  โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚   ๅฎžไพ‹ๆ•ฐๆฎ (Instance Data)       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚   ๅฏน้ฝๅกซๅ…… (Padding)             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

Mark Word็š„็ง˜ๅฏ† ๐ŸŽญ

Mark Word๏ผš64ไฝ๏ผˆๅœจ64ไฝJVMไธญ๏ผ‰๏ผŒๅญ˜ๅ‚จๅฏน่ฑก็š„่ฟ่กŒๆ—ถไฟกๆฏ

64ไฝ Mark Word ็š„ๅคšๅ‰ฏ้ขๅญ”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ๆ นๆฎ้”็Šถๆ€๏ผŒMark Wordๅญ˜ๅ‚จไธๅŒๅ†…ๅฎน๏ผ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๆ— ้”็Šถๆ€                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ unused(25) | hashcode(31) | age(4) | 0 | 01 |
โ”‚                                      โ†‘    โ†‘  โ”‚
โ”‚                                   ๅๅ‘  ้”ๆ ‡ๅฟ—โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๅๅ‘้”็Šถๆ€                            โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ threadID(54) | epoch(2) | age(4) | 1 | 01 |
โ”‚    โ†‘                               โ†‘    โ†‘  โ”‚
โ”‚ ็บฟ็จ‹ID                           ๅๅ‘  ้”ๆ ‡ๅฟ—โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ่ฝป้‡็บง้”็Šถๆ€                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ptr_to_lock_record(62) | 00 |
โ”‚    โ†‘                      โ†‘  โ”‚
โ”‚ ๆ ˆไธญ้”่ฎฐๅฝ•ๆŒ‡้’ˆ          ้”ๆ ‡ๅฟ—โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ้‡้‡็บง้”็Šถๆ€                          โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ ptr_to_monitor(62) | 10 |
โ”‚    โ†‘                  โ†‘  โ”‚
โ”‚ Monitorๅฏน่ฑกๆŒ‡้’ˆ     ้”ๆ ‡ๅฟ—โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

้”ๆ ‡ๅฟ—ไฝๅฏน็…ง่กจ๏ผš

้”็Šถๆ€ๅๅ‘ๆ ‡ๅฟ—้”ๆ ‡ๅฟ—ๅญ˜ๅ‚จๅ†…ๅฎน
ๆ— ้”001hashcodeใ€age
ๅๅ‘้”101็บฟ็จ‹IDใ€epochใ€age
่ฝป้‡็บง้”-00ๆ ˆไธญ้”่ฎฐๅฝ•ๆŒ‡้’ˆ
้‡้‡็บง้”-10MonitorๆŒ‡้’ˆ
GCๆ ‡่ฎฐ-11๏ผˆGCไฝฟ็”จ๏ผ‰

๐Ÿง˜ ๅๅ‘้”๏ผˆBiased Locking๏ผ‰

่ฎพ่ฎกๆ€ๆƒณ ๐Ÿ’ก

่ง‚ๅฏŸ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ๅคง้ƒจๅˆ†้”ๅœจๆ•ดไธช็”Ÿๅ‘ฝๅ‘จๆœŸๅ†…๏ผš
- ๅช่ขซไธ€ไธช็บฟ็จ‹่ฎฟ้—ฎ
- ไปŽไธๅ‘็”Ÿ็ซžไบ‰

ไผ˜ๅŒ–๏ผš
ๆ—ข็„ถๆ€ปๆ˜ฏๅŒไธ€ไธช็บฟ็จ‹๏ผš
- ็ฌฌไธ€ๆฌก่ฎฐๅฝ•็บฟ็จ‹ID
- ไปฅๅŽ็›ดๆŽฅ่ฟ›๏ผŒไธ็”จๅŠ ้”๏ผ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅŠ ้”ๆต็จ‹ ๐Ÿ”‘

็บฟ็จ‹A้ฆ–ๆฌก่ฎฟ้—ฎ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๆฃ€ๆŸฅMark Word็š„้”ๆ ‡ๅฟ—
2. ๅ‘็Žฐๆ˜ฏๆ— ้”็Šถๆ€๏ผˆ01๏ผ‰
3. CASๅฐ†็บฟ็จ‹IDๅ†™ๅ…ฅMark Word
4. ๆˆๅŠŸ๏ผๅๅ‘้”่Žทๅ–ๆˆๅŠŸ โœ…

็บฟ็จ‹Aๅ†ๆฌก่ฎฟ้—ฎ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๆฃ€ๆŸฅMark Word
2. ๅ‘็Žฐ็บฟ็จ‹IDๆ˜ฏ่‡ชๅทฑ
3. ็›ดๆŽฅ่ฟ›ๅ…ฅๅŒๆญฅๅ—๏ผโšก ่ถ…ๅฟซ๏ผ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

็บฟ็จ‹Bๆฅ่ฎฟ้—ฎ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๆฃ€ๆŸฅMark Word
2. ๅ‘็Žฐ็บฟ็จ‹IDไธๆ˜ฏ่‡ชๅทฑ
3. ๅ‡็บงๅˆฐ่ฝป้‡็บง้”๏ผโฌ†๏ธ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ไปฃ็ ็คบไพ‹ ๐Ÿ’ป

public class BiasedLockDemo {
    private Object lock = new Object();
    
    public void method() {
        synchronized (lock) {
            // ็ฌฌไธ€ๆฌก๏ผšCAS่ฎพ็ฝฎ็บฟ็จ‹ID
            // ็ฌฌไบŒๆฌก๏ผšๆฃ€ๆŸฅID๏ผŒ็›ดๆŽฅ่ฟ›
            // ็ฌฌไธ‰ๆฌก๏ผšๆฃ€ๆŸฅID๏ผŒ็›ดๆŽฅ่ฟ›
            // ...
        }
    }
    
    public static void main(String[] args) {
        BiasedLockDemo demo = new BiasedLockDemo();
        
        // ๅŒไธ€ไธช็บฟ็จ‹ๅๅค่ฐƒ็”จ
        for (int i = 0; i < 1000; i++) {
            demo.method();  // ๅชๆœ‰็ฌฌไธ€ๆฌกCAS๏ผŒๅŽ็ปญ้ƒฝๆ˜ฏ็›ดๆŽฅ่ฟ›๏ผโšก
        }
    }
}

ๅๅ‘้”ๆ’ค้”€ โŒ

ไป€ไนˆๆ—ถๅ€™ๆ’ค้”€๏ผŸ

1. ๅ…ถไป–็บฟ็จ‹ๅฐ่ฏ•่Žทๅ–้”
2. ่ฐƒ็”จhashCode()
3. ่ฐƒ็”จwait/notify
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๆ’ค้”€่ฟ‡็จ‹๏ผš
1. ๅˆฐ่พพๅฎ‰ๅ…จ็‚น๏ผˆSafepoint๏ผ‰
2. ๆš‚ๅœๆ‹ฅๆœ‰้”็š„็บฟ็จ‹
3. ๆฃ€ๆŸฅ็บฟ็จ‹ๆ˜ฏๅฆ่ฟ˜ๅœจๅŒๆญฅๅ—ไธญ
   - ๆ˜ฏ๏ผšๅ‡็บงไธบ่ฝป้‡็บง้”
   - ๅฆ๏ผšๆขๅคไธบๆ— ้”็Šถๆ€
4. ๆขๅค็บฟ็จ‹
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๆ‰น้‡้‡ๅๅ‘ๅ’Œๆ‰น้‡ๆ’ค้”€ ๐Ÿ“ฆ

ๅœบๆ™ฏ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
List<Object> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
    list.add(new Object());
}

// ็บฟ็จ‹A๏ผš็ป™ๆ‰€ๆœ‰ๅฏน่ฑกๅŠ ๅๅ‘้”
for (Object obj : list) {
    synchronized (obj) { /* ... */ }
}

// ็บฟ็จ‹B๏ผš่ฎฟ้—ฎ็›ธๅŒๅฏน่ฑก
for (Object obj : list) {
    synchronized (obj) { /* ... */ }  
    // ่งฆๅ‘ๆ‰น้‡้‡ๅๅ‘๏ผ
}
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๆ‰น้‡้‡ๅๅ‘๏ผš
- ๆ’ค้”€ๆฌกๆ•ฐ่พพๅˆฐ20ๆฌก
- JVM่ฎคไธบๅฏน่ฑก่ขซไธๅŒ็บฟ็จ‹่ฝฎๆตไฝฟ็”จ
- ๆ‰น้‡ๅฐ†ๅๅ‘ๆ’ค้”€๏ผŒ้‡ๆ–ฐๅๅ‘ๆ–ฐ็บฟ็จ‹

ๆ‰น้‡ๆ’ค้”€๏ผš
- ๆ’ค้”€ๆฌกๆ•ฐ่พพๅˆฐ40ๆฌก
- JVM่ฎคไธบ่ฏฅ็ฑปไธ้€‚ๅˆๅๅ‘้”
- ๆ•ดไธช็ฑป็š„ๅฏน่ฑก้ƒฝไธๅ†ไฝฟ็”จๅๅ‘้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅ…ณ้—ญๅๅ‘้” ๐Ÿ”ง

# JDK 6-14๏ผš้ป˜่ฎคๅผ€ๅฏ
-XX:+UseBiasedLocking

# JDK 15+๏ผš้ป˜่ฎคๅ…ณ้—ญ๏ผˆๅ› ไธบๆ”ถ็›Šไธๅคง๏ผ‰
-XX:-UseBiasedLocking

# ๅปถ่ฟŸๅผ€ๅฏ๏ผˆ้ป˜่ฎคๅปถ่ฟŸ4็ง’๏ผ‰
-XX:BiasedLockingStartupDelay=0

๐Ÿ˜ฐ ่ฝป้‡็บง้”๏ผˆLightweight Locking๏ผ‰

่ฎพ่ฎกๆ€ๆƒณ ๐Ÿ’ก

่ง‚ๅฏŸ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ๆœ‰ๅคšไธช็บฟ็จ‹่ฎฟ้—ฎ้”๏ผš
- ไฝ†ไธๆ˜ฏๅŒๆ—ถ่ฎฟ้—ฎ
- ็ซžไบ‰ไธๆฟ€็ƒˆ
- ้€š่ฟ‡่‡ชๆ—‹็ญ‰ๅพ…ๅณๅฏ

ไผ˜ๅŒ–๏ผš
ไฝฟ็”จCAS + ่‡ชๆ—‹๏ผš
- ไธ้œ€่ฆๆ“ไฝœ็ณป็ปŸไป‹ๅ…ฅ
- ๅœจ็”จๆˆทๆ€ๅฎŒๆˆ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅŠ ้”ๆต็จ‹ ๐Ÿ”‘

็บฟ็จ‹AๅŠ ้”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๅœจๆ ˆๅธงไธญๅˆ›ๅปบLock Record๏ผˆ้”่ฎฐๅฝ•๏ผ‰
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Lock Record                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚ Displaced Mark Word โ”‚ โ† ๅค‡ไปฝๅŽŸMark Word
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ Owner Pointer       โ”‚ โ† ๆŒ‡ๅ‘้”ๅฏน่ฑก
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. ๅคๅˆถMark WordๅˆฐDisplaced Mark Word

3. CASๅฐ†ๅฏน่ฑก็š„Mark Wordๆ›ฟๆขไธบLock RecordๆŒ‡้’ˆ
   โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
   Mark Word: [Lock RecordๆŒ‡้’ˆ | 00]
   โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

4. CASๆˆๅŠŸ โ†’ ๅŠ ้”ๆˆๅŠŸ โœ…
   CASๅคฑ่ดฅ โ†’ ่‡ชๆ—‹้‡่ฏ•ๆˆ–ๅ‡็บง
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

็บฟ็จ‹A่งฃ้”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. CASๅฐ†Displaced Mark Wordๆ›ฟๆขๅ›žๅฏน่ฑก
2. ๆˆๅŠŸ โ†’ ่งฃ้”ๆˆๅŠŸ โœ…
3. ๅคฑ่ดฅ โ†’ ้”ๅทฒๅ‡็บง๏ผŒ้‡Šๆ”พ้‡้‡็บง้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

่‡ชๆ—‹ไผ˜ๅŒ– ๐Ÿ”„

่‡ชๆ—‹ = ๅพช็Žฏ็ญ‰ๅพ…
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
while (่Žทๅ–้”ๅคฑ่ดฅ) {
    // ็ฉบ่ฝฌ๏ผŒๆถˆ่€—CPU
    // ๆœŸๆœ›้”ๅพˆๅฟซ่ขซ้‡Šๆ”พ
}
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

่‡ช้€‚ๅบ”่‡ชๆ—‹๏ผš
- ไธŠๆฌก่‡ชๆ—‹ๆˆๅŠŸ โ†’ ๅขžๅŠ ่‡ชๆ—‹ๆฌกๆ•ฐ
- ไธŠๆฌก่‡ชๆ—‹ๅคฑ่ดฅ โ†’ ๅ‡ๅฐ‘่‡ชๆ—‹ๆฌกๆ•ฐ
- JVM่‡ชๅŠจ่ฐƒๆ•ด๏ผŒๆ— ้œ€ๆ‰‹ๅŠจ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

็”Ÿๆดป็ฑปๆฏ”๏ผš

่‡ชๆ—‹ = ็ญ‰็บข็ปฟ็ฏ ๐Ÿšฆ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
็บข็ฏๅ€’่ฎกๆ—ถ3็ง’๏ผš
- ไฝ ๅœจๅŽŸๅœฐ็ญ‰๏ผˆ่‡ชๆ—‹๏ผ‰
- ไธ็†„็ซ๏ผŒไธ็ฆปๅผ€

็บข็ฏๅ€’่ฎกๆ—ถ60็ง’๏ผš
- ไฝ ็†„็ซ๏ผŒ็Žฉๆ‰‹ๆœบ๏ผˆ้˜ปๅกž๏ผ‰
- ๅˆฐ็‚นๅ†ๅฏๅŠจ๏ผˆๅ”ค้†’๏ผ‰
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

่ฝป้‡็บง้”ๅ‡็บง โฌ†๏ธ

่งฆๅ‘ๆกไปถ๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ่‡ชๆ—‹ๆฌกๆ•ฐ่ถ…่ฟ‡้˜ˆๅ€ผ๏ผˆ้ป˜่ฎค10ๆฌก๏ผ‰
2. ่‡ชๆ—‹็บฟ็จ‹ๆ•ฐ่ถ…่ฟ‡CPUๆ ธๅฟƒๆ•ฐไธ€ๅŠ
3. ๅ…ถไป–็บฟ็จ‹ไนŸๅœจ็ญ‰ๅพ…้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅ‡็บง่ฟ‡็จ‹๏ผš
1. ๅˆ†้…Monitorๅฏน่ฑก
2. ๅฐ†Mark WordๆŒ‡ๅ‘Monitor
3. ้”ๆ ‡ๅฟ—ไฝๆ”นไธบ10๏ผˆ้‡้‡็บง้”๏ผ‰
4. ้˜ปๅกž็ญ‰ๅพ…็บฟ็จ‹
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ˜ก ้‡้‡็บง้”๏ผˆHeavyweight Locking๏ผ‰

Monitorๅฏน่ฑก ๐ŸŽ›๏ธ

Monitor = ๆ“ไฝœ็ณป็ปŸไบ’ๆ–ฅ้‡ + ๆกไปถๅ˜้‡
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Monitor                    โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚ _owner: ๆ‹ฅๆœ‰่€…็บฟ็จ‹  โ”‚    โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ _count: ้‡ๅ…ฅๆฌกๆ•ฐ    โ”‚    โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ _WaitSet: ็ญ‰ๅพ…้˜Ÿๅˆ—  โ”‚ โ† wait()็š„็บฟ็จ‹
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ _EntryList: ้”ๆฑ     โ”‚ โ† ็ซžไบ‰็š„็บฟ็จ‹
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

ๅŠ ้”ๆต็จ‹ ๐Ÿ”‘

็บฟ็จ‹AๅŠ ้”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ๆฃ€ๆŸฅ_owner
2. ๅฆ‚ๆžœไธบ็ฉบ๏ผš
   - ่ฎพ็ฝฎ_owner = ็บฟ็จ‹A
   - ๅŠ ้”ๆˆๅŠŸ โœ…
3. ๅฆ‚ๆžœไธไธบ็ฉบ๏ผš
   - ่ฟ›ๅ…ฅ_EntryList็ญ‰ๅพ…
   - ๆ“ไฝœ็ณป็ปŸๆŒ‚่ตท็บฟ็จ‹๏ผˆ้˜ปๅกž๏ผ‰โธ๏ธ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

็บฟ็จ‹A่งฃ้”๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ่ฎพ็ฝฎ_owner = null
2. ๅ”ค้†’_EntryListไธญ็š„ไธ€ไธช็บฟ็จ‹
3. ่ขซๅ”ค้†’็š„็บฟ็จ‹็ซžไบ‰้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

wait/notifyๅŽŸ็† ๐Ÿ“ข

wait()๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ้‡Šๆ”พ้”๏ผˆ_owner = null๏ผ‰
2. ่ฟ›ๅ…ฅ_WaitSet็ญ‰ๅพ…
3. ้˜ปๅกž โธ๏ธ
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

notify()๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
1. ไปŽ_WaitSetไธญๅ”ค้†’ไธ€ไธช็บฟ็จ‹
2. ่ขซๅ”ค้†’็š„็บฟ็จ‹่ฟ›ๅ…ฅ_EntryList
3. ็ซžไบ‰้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

notifyAll()๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ๅ”ค้†’_WaitSetไธญ็š„ๆ‰€ๆœ‰็บฟ็จ‹
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐ŸŽฌ ๅฎŒๆ•ด็š„้”ๅ‡็บง่ฟ‡็จ‹

็คบไพ‹ไปฃ็  ๐Ÿ’ป

public class LockUpgradeDemo {
    private Object lock = new Object();
    
    public void doWork() {
        synchronized (lock) {
            // ไธšๅŠก้€ป่พ‘
        }
    }
    
    public static void main(String[] args) throws Exception {
        LockUpgradeDemo demo = new LockUpgradeDemo();
        
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        // ้˜ถๆฎต1: ๆ— ้” โ†’ ๅๅ‘้”
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        Thread.sleep(5000);  // ็ญ‰ๅพ…ๅๅ‘้”ๅฏๅŠจ
        
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                demo.doWork();  // ็ฌฌไธ€ๆฌก๏ผšCAS่ฎพ็ฝฎ็บฟ็จ‹ID๏ผˆๅๅ‘้”๏ผ‰
                                // ๅŽ็ปญ๏ผšๆฃ€ๆŸฅID๏ผŒ็›ดๆŽฅ่ฟ›
            }
        });
        t1.start();
        t1.join();
        
        System.out.println("้˜ถๆฎต1ๅฎŒๆˆ๏ผšๅๅ‘้”");
        
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        // ้˜ถๆฎต2: ๅๅ‘้” โ†’ ่ฝป้‡็บง้”
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                demo.doWork();  // ๆฃ€ๆต‹ๅˆฐๅ…ถไป–็บฟ็จ‹๏ผŒๅ‡็บงไธบ่ฝป้‡็บง้”
            }
        });
        t2.start();
        t2.join();
        
        System.out.println("้˜ถๆฎต2ๅฎŒๆˆ๏ผš่ฝป้‡็บง้”");
        
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        // ้˜ถๆฎต3: ่ฝป้‡็บง้” โ†’ ้‡้‡็บง้”
        // โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
        Thread t3 = new Thread(() -> {
            synchronized (demo.lock) {
                try {
                    Thread.sleep(1000);  // ๆŒๆœ‰้”1็ง’
                } catch (InterruptedException e) {}
            }
        });
        
        Thread t4 = new Thread(() -> {
            synchronized (demo.lock) {
                // t4่‡ชๆ—‹็ญ‰ๅพ…๏ผŒ่ถ…่ฟ‡้˜ˆๅ€ผๅŽๅ‡็บงไธบ้‡้‡็บง้”
            }
        });
        
        t3.start();
        Thread.sleep(100);  // ็กฎไฟt3ๅ…ˆ่Žทๅ–้”
        t4.start();
        
        t3.join();
        t4.join();
        
        System.out.println("้˜ถๆฎต3ๅฎŒๆˆ๏ผš้‡้‡็บง้”");
    }
}

ๅ‡็บงๆ—ถๅบๅ›พ ๐Ÿ“Š

ๆ—ถ้—ด โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ†’

็บฟ็จ‹1: โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
         โ”‚ ๅๅ‘้”      โ”‚ ่ฝป้‡็บง้”
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็บฟ็จ‹2:           โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€
                   โ”‚ ่ฝป้‡็บง้” โ”‚
                   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็บฟ็จ‹3:                    โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€
                            โ”‚ ้‡้‡็บง้”
                            โ”‚ (ๆŒๆœ‰)
                            โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€

็บฟ็จ‹4:                    โ”€โ”€โ”€โธ๏ธโ”€โ”€โ”€โ”€โ”€โ”€
                            ็ญ‰ๅพ…
                            (้˜ปๅกž)

Mark Wordๅ˜ๅŒ–๏ผš
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
[hashcode | age | 0 | 01]  ๆ— ้”
      โ†“
[threadID | epoch | age | 1 | 01]  ๅๅ‘้”
      โ†“
[Lock RecordๆŒ‡้’ˆ | 00]  ่ฝป้‡็บง้”
      โ†“
[MonitorๆŒ‡้’ˆ | 10]  ้‡้‡็บง้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ“Š ้”ๅฏนๆฏ”่กจ

้”็ฑปๅž‹ไผ˜็‚น็ผบ็‚น้€‚็”จๅœบๆ™ฏ
ๅๅ‘้”ๆ— ้œ€CAS๏ผŒๆžๅฟซๆ’ค้”€ๅผ€้”€ๅคงๅ•็บฟ็จ‹่ฎฟ้—ฎ
่ฝป้‡็บง้”็ซžไบ‰ไธๆฟ€็ƒˆๆ—ถๆ€ง่ƒฝๅฅฝ่‡ชๆ—‹ๆถˆ่€—CPUๅฐ‘้‡็บฟ็จ‹ใ€ๆŒ้”ๆ—ถ้—ด็Ÿญ
้‡้‡็บง้”ไธๆถˆ่€—CPU็บฟ็จ‹้˜ปๅกž๏ผŒไธŠไธ‹ๆ–‡ๅˆ‡ๆขๆฟ€็ƒˆ็ซžไบ‰ใ€ๆŒ้”ๆ—ถ้—ด้•ฟ

ๆ€ง่ƒฝๅฏนๆฏ” โšก

ๅœบๆ™ฏ๏ผš100ไธ‡ๆฌกๅŠ ่งฃ้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
ๅๅ‘้”๏ผš
- ๅ•็บฟ็จ‹๏ผš50ms  โœ… ่ถ…ๅฟซ๏ผ
- ๅคš็บฟ็จ‹๏ผšๅ‡็บงๅผ€้”€...

่ฝป้‡็บง้”๏ผš
- ๆ— ็ซžไบ‰๏ผš80ms  โœ… ๅพˆๅฟซ
- ่ฝปๅบฆ็ซžไบ‰๏ผš150ms  โš ๏ธ ่ฟ˜่กŒ
- ๆฟ€็ƒˆ็ซžไบ‰๏ผšๅ‡็บงๅˆฐ้‡้‡็บง...

้‡้‡็บง้”๏ผš
- ๆฟ€็ƒˆ็ซžไบ‰๏ผš500ms  โš ๏ธ ๆ…ข
- ไฝ†ไธไผšๆ›ดๆ…ขไบ†๏ผˆๅบ•็บฟ๏ผ‰
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐ŸŽฏ ้”ไผ˜ๅŒ–ๆŠ€ๅทง

1. ๅ‡ๅฐ้”็ฒ’ๅบฆ ๐Ÿ”ฌ

// โŒ ็ฒ—็ฒ’ๅบฆ้”
public synchronized void method() {
    doA();  // 10ms
    doB();  // 100ms
    doC();  // 10ms
}

// โœ… ็ป†็ฒ’ๅบฆ้”
public void method() {
    synchronized (lockA) { doA(); }
    doB();  // ไธ้œ€่ฆ้”
    synchronized (lockC) { doC(); }
}

2. ้”ๅˆ†็ฆป ๐Ÿ”€

// โŒ ่ฏปๅ†™ๅ…ฑ็”จไธ€ไธช้”
public synchronized Object get(String key) { ... }
public synchronized void put(String key, Object value) { ... }

// โœ… ่ฏปๅ†™้”ๅˆ†็ฆป
private ReadWriteLock lock = new ReentrantReadWriteLock();

public Object get(String key) {
    lock.readLock().lock();
    try {
        return map.get(key);
    } finally {
        lock.readLock().unlock();
    }
}

public void put(String key, Object value) {
    lock.writeLock().lock();
    try {
        map.put(key, value);
    } finally {
        lock.writeLock().unlock();
    }
}

3. ้”็ฒ—ๅŒ– ๐ŸŽฏ

// โŒ ้ข‘็นๅŠ ้”่งฃ้”
for (int i = 0; i < 1000; i++) {
    synchronized (lock) {
        list.add(i);
    }
}

// โœ… ้”็ฒ—ๅŒ–
synchronized (lock) {
    for (int i = 0; i < 1000; i++) {
        list.add(i);
    }
}

4. ้”ๆถˆ้™ค โœ‚๏ธ

// JITไผš่‡ชๅŠจๆถˆ้™คไธๅฟ…่ฆ็š„้”
public void method() {
    StringBuffer sb = new StringBuffer();  // ๅฑ€้ƒจๅ˜้‡
    sb.append("a");  // StringBufferๅ†…้ƒจๆ˜ฏsynchronized็š„
    sb.append("b");
    // JITๅ‘็Žฐsbไธไผš้€ƒ้€ธ๏ผŒ่‡ชๅŠจๆถˆ้™ค้”๏ผ
}

๐Ÿ’ก Pro Tips

Tip 1: ๆŸฅ็œ‹้”็Šถๆ€ ๐Ÿ”

ไฝฟ็”จJOL๏ผˆJava Object Layout๏ผ‰ๅทฅๅ…ท๏ผš

<dependency>
    <groupId>org.openjdk.jol</groupId>
    <artifactId>jol-core</artifactId>
    <version>0.16</version>
</dependency>
import org.openjdk.jol.info.ClassLayout;

public class LockStateViewer {
    public static void main(String[] args) throws Exception {
        Object obj = new Object();
        
        // 1. ๆ— ้”็Šถๆ€
        System.out.println("ๆ— ้”:");
        System.out.println(ClassLayout.parseInstance(obj).toPrintable());
        
        // 2. ๅๅ‘้”
        Thread.sleep(5000);  // ็ญ‰ๅพ…ๅๅ‘้”ๅฏๅŠจ
        synchronized (obj) {
            System.out.println("ๅๅ‘้”:");
            System.out.println(ClassLayout.parseInstance(obj).toPrintable());
        }
        
        // 3. ่ฝป้‡็บง้”
        new Thread(() -> {
            synchronized (obj) {
                System.out.println("่ฝป้‡็บง้”:");
                System.out.println(ClassLayout.parseInstance(obj).toPrintable());
            }
        }).start();
    }
}

Tip 2: ้ฟๅ…้”ๅ‡็บง ๐Ÿšซ

# ๅฏนไบŽ้ซ˜ๅนถๅ‘ๅœบๆ™ฏ๏ผŒ็›ดๆŽฅๅ…ณ้—ญๅๅ‘้”
-XX:-UseBiasedLocking

# ๅŽŸๅ› ๏ผš
# - ๅๅ‘้”ๆ’ค้”€ๅผ€้”€ๅคง
# - ้ซ˜ๅนถๅ‘ไธ‹ๅพˆๅฟซๅ‡็บง๏ผŒไธๅฆ‚็›ดๆŽฅ็”จ่ฝป้‡็บง้”

Tip 3: ็›‘ๆŽง้”็ซžไบ‰ ๐Ÿ“Š

ThreadMXBean threadMBean = ManagementFactory.getThreadMXBean();

// ๅผ€ๅฏ็บฟ็จ‹็ซžไบ‰็›‘ๆŽง
threadMBean.setThreadContentionMonitoringEnabled(true);

// ่Žทๅ–้”็ญ‰ๅพ…ๆ—ถ้—ด
long waitedTime = threadMBean.getThreadInfo(threadId).getWaitedTime();
long blockedTime = threadMBean.getThreadInfo(threadId).getBlockedTime();

System.out.println("็ญ‰ๅพ…ๆ—ถ้—ด: " + waitedTime + "ms");
System.out.println("้˜ปๅกžๆ—ถ้—ด: " + blockedTime + "ms");

๐ŸŽ“ ้ข่ฏ•่ฆ็‚น

้ซ˜้ข‘้—ฎ้ข˜

Q1: synchronizedๆ˜ฏๆ€Žไนˆๅฎž็Žฐ็š„๏ผŸ

็ญ”ๆกˆ๏ผš ๅŸบไบŽMonitorๅฏน่ฑก๏ผš

  1. ๅๅ‘้”๏ผšMark Word่ฎฐๅฝ•็บฟ็จ‹ID๏ผŒCAS่ฎพ็ฝฎ
  2. ่ฝป้‡็บง้”๏ผšๆ ˆไธญLock Record๏ผŒCAS + ่‡ชๆ—‹
  3. ้‡้‡็บง้”๏ผšMonitorๅฏน่ฑก๏ผŒๆ“ไฝœ็ณป็ปŸไบ’ๆ–ฅ้‡

Q2: ไธบไป€ไนˆๆœ‰้”ๅ‡็บง๏ผŸ

็ญ”ๆกˆ๏ผš

  • ๅคง้ƒจๅˆ†้”ๆฒกๆœ‰็ซžไบ‰๏ผˆ95%๏ผ‰
  • ้”ๅ‡็บงๅฏไปฅๆ นๆฎ็ซžไบ‰็จ‹ๅบฆไผ˜ๅŒ–ๆ€ง่ƒฝ
  • ๆ— ็ซžไบ‰็”จๅๅ‘้”๏ผˆๆœ€ๅฟซ๏ผ‰
  • ่ฝปๅบฆ็ซžไบ‰็”จ่ฝป้‡็บง้”๏ผˆ่พƒๅฟซ๏ผ‰
  • ๆฟ€็ƒˆ็ซžไบ‰็”จ้‡้‡็บง้”๏ผˆไฟๅบ•๏ผ‰

Q3: ้”่ƒฝ้™็บงๅ—๏ผŸ

็ญ”ๆกˆ๏ผš

  • JDK 15ไน‹ๅ‰๏ผšไธ่ƒฝ้™็บง
  • JDK 15+๏ผšๅผ•ๅ…ฅไบ†ZGC๏ผŒๆ”ฏๆŒ้”้™็บง
  • ไฝ†้™็บงๆกไปถ่‹›ๅˆป๏ผŒๅฎž้™…ๅพˆๅฐ‘ๅ‘็”Ÿ

๐ŸŽ‰ ๆ€ป็ป“

๐ŸŽฏ ้”ๅ‡็บง่ทฏๅพ„

ๆ— ้” โ†’ ๅๅ‘้” โ†’ ่ฝป้‡็บง้” โ†’ ้‡้‡็บง้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
่งฆๅ‘ๆกไปถ๏ผš
1. ๅ•็บฟ็จ‹ โ†’ ๅๅ‘้”
2. ๅ…ถไป–็บฟ็จ‹ โ†’ ่ฝป้‡็บง้”
3. ่‡ชๆ—‹ๅคฑ่ดฅ โ†’ ้‡้‡็บง้”
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ“‹ ไผ˜ๅŒ–ๅปบ่ฎฎ

  1. ๅ‡ๅฐ‘้”่Œƒๅ›ด๏ผšๅช้”ๅฟ…่ฆไปฃ็ 
  2. ๅ‡ๅฐ‘้”ๆ—ถ้—ด๏ผšๅฐฝๅฟซ้‡Šๆ”พ
  3. ้”ๅˆ†็ฆป๏ผš่ฏปๅ†™้”ใ€ๅˆ†ๆฎต้”
  4. ๆ— ้”็ผ–็จ‹๏ผšCASใ€ThreadLocal

่ฎฐไฝ๏ผš้”ๅ‡็บงๆ˜ฏJVM็š„่‡ชๅŠจไผ˜ๅŒ–๏ผŒ็†่งฃๅŽŸ็†ๆ‰่ƒฝๅ†™ๅ‡บ้ซ˜ๆ€ง่ƒฝไปฃ็ ๏ผโšก

๐ŸŒŸ "้”็š„่‰บๆœฏๅœจไบŽ๏ผš่ฏฅๅฟซๅˆ™ๅฟซ๏ผŒ่ฏฅๆ…ขไธๆ…Œ๏ผ" ๐Ÿ˜Ž