้ข่ฏ่็น๏ผๅๅ้ใ่ฝป้็บง้ใ้้็บง้็ๅ็บง่ฟ็จๅ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ๅฏน่ฑกๆ้ ้ๆ ๅฟโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
้ๆ ๅฟไฝๅฏน็ ง่กจ๏ผ
| ้็ถๆ | ๅๅๆ ๅฟ | ้ๆ ๅฟ | ๅญๅจๅ ๅฎน |
|---|---|---|---|
| ๆ ้ | 0 | 01 | hashcodeใage |
| ๅๅ้ | 1 | 01 | ็บฟ็จIDใepochใage |
| ่ฝป้็บง้ | - | 00 | ๆ ไธญ้่ฎฐๅฝๆ้ |
| ้้็บง้ | - | 10 | Monitorๆ้ |
| 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ๅฏน่ฑก๏ผ
- ๅๅ้๏ผMark Word่ฎฐๅฝ็บฟ็จID๏ผCAS่ฎพ็ฝฎ
- ่ฝป้็บง้๏ผๆ ไธญLock Record๏ผCAS + ่ชๆ
- ้้็บง้๏ผMonitorๅฏน่ฑก๏ผๆไฝ็ณป็ปไบๆฅ้
Q2: ไธบไปไนๆ้ๅ็บง๏ผ
็ญๆก๏ผ
- ๅคง้จๅ้ๆฒกๆ็ซไบ๏ผ95%๏ผ
- ้ๅ็บงๅฏไปฅๆ นๆฎ็ซไบ็จๅบฆไผๅๆง่ฝ
- ๆ ็ซไบ็จๅๅ้๏ผๆๅฟซ๏ผ
- ่ฝปๅบฆ็ซไบ็จ่ฝป้็บง้๏ผ่พๅฟซ๏ผ
- ๆฟ็็ซไบ็จ้้็บง้๏ผไฟๅบ๏ผ
Q3: ้่ฝ้็บงๅ๏ผ
็ญๆก๏ผ
- JDK 15ไนๅ๏ผไธ่ฝ้็บง
- JDK 15+๏ผๅผๅ ฅไบZGC๏ผๆฏๆ้้็บง
- ไฝ้็บงๆกไปถ่ๅป๏ผๅฎ้ ๅพๅฐๅ็
๐ ๆป็ป
๐ฏ ้ๅ็บง่ทฏๅพ
ๆ ้ โ ๅๅ้ โ ่ฝป้็บง้ โ ้้็บง้
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
่งฆๅๆกไปถ๏ผ
1. ๅ็บฟ็จ โ ๅๅ้
2. ๅ
ถไป็บฟ็จ โ ่ฝป้็บง้
3. ่ชๆๅคฑ่ดฅ โ ้้็บง้
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐ ไผๅๅปบ่ฎฎ
- ๅๅฐ้่ๅด๏ผๅช้ๅฟ ่ฆไปฃ็
- ๅๅฐ้ๆถ้ด๏ผๅฐฝๅฟซ้ๆพ
- ้ๅ็ฆป๏ผ่ฏปๅ้ใๅๆฎต้
- ๆ ้็ผ็จ๏ผCASใThreadLocal
่ฎฐไฝ๏ผ้ๅ็บงๆฏJVM็่ชๅจไผๅ๏ผ็่งฃๅ็ๆ่ฝๅๅบ้ซๆง่ฝไปฃ็ ๏ผโก
๐ "้็่บๆฏๅจไบ๏ผ่ฏฅๅฟซๅๅฟซ๏ผ่ฏฅๆ ขไธๆ ๏ผ" ๐