-
Notifications
You must be signed in to change notification settings - Fork 2
/
multithread.txt
33 lines (20 loc) · 2.29 KB
/
multithread.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Synchronized = ReentrantLock after 1.6
optimize lock CAS:
AtomicInteger aa = new AtomicInteger (0);
aa.incrementAndGet() return new number.
No lock pattern
Reentrant Code (Pure Code) function don't call shared variable.
Thread Local Storage
每一個ThreadLocal對象就是當前綫程的ThreadLocalMap的訪問入口,每一個ThreadLocal對象都包含了一個獨一無二的threadLocalHashCode值,通過這個值就能夠在綫程的K-V值對鈡找回對應的本地綫程變量。
Adaptive Spinning
-XX:+UseSpinning 開啓 自選鎖開銷大,缺省如果十次還不成功就要suspend thread。-XX:PreBlockSpin來更改缺省的十次 Java1.6后自旋鎖可以自動設定這個值。根據情況改變。
Lock Elimination
編譯后自動消除鎖。 比如String a+b+c,編譯時自動轉換成StringBuffer。append進行。然後編譯器會發現無共享,自動消除裏面的鎖。
Lock Coarsening
在循環或者遞歸中,如果編譯器察覺到有對某一個邏輯反復地枷鎖解鎖,就會把這個鎖放到循環體外。
Lightweight Locking
每一個object都有一個32位或者64位的Mark Word,在沒有被鎖的情況下32位當中有25bit哈希碼,4bit分代年齡,1bit固定為0. 如果鎖定
則這個Mark Word上會出現鎖定位標識。GC 標志也在上面。鎖的時候,先copy 原來的Mark Word,然後用CAS 修改原來的MarkWord上面的值為指向這個copy的地址加上標志位00。如果CAS失敗,先看看當前的MARK WORD是不是指向當前綫程的stack frame。如果是,那麽説明已經有鎖了,繼續執行。如果不是,那就是被搶了。這時候輕量鎖就不再有效。要膨脹為重量鎖。狀態值邊緣10.後面等待鎖的綫程也都進入block。
解鎖也是個CAS,如果替換不回來,那麽就説明其他綫程嘗試過加鎖。那這個時候就需要喚醒等待的綫程。
Biased Locking
同上,標志位01.如果CAS寫入thread id成功,那麽以後進入這個鎖相關同步的時候,不再做同步。如果有競爭,那麽Revoke Bias后恢復到未鎖定01或者00,變成輕量級鎖。