CAS:
Compare and Swap,即比較再交換。
jdk5增加了并發包java.util.concurrent.*,其下面的類使用CAS算法實現了區別于synchronouse同步鎖的一種樂觀鎖。JDK 5之前Java語言是靠synchronized關鍵字保證同步的,這是一種獨占鎖,也是是悲觀鎖。
?
?
?
?CAS算法理解
對CAS的理解,CAS是一種無鎖算法,CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做.
?
查看對象在內存中的布局:
引入依賴
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.10</version></dependency>
?
?
對象在內存中的布共分為四部分:
?
?
對象在內存中的布共分為四部分:
-
Markword:主要存儲鎖的信息和GC的信息,占8個字節
-
類型指針class pointer :指向這個類在內存中的Class對象,占4個字節
-
實例數據 instance data : 這個類中實例對象所占的內存,如果int a 則占4個字節,如果時long b,則占8個字節
-
對齊padding:如果前邊幾個加起來的字節數不是8的整數倍,則填充補齊
所以Object o = new Object();在內存中共占用8+4+0+4共16個字節
?
?
?
?
?
?
鎖的升級:鎖的信息記錄在markword中.
-
Object o = new Object();在對象剛剛被new出來時,沒有加任何鎖.用markdown中最低三位代表鎖狀態,其中一位是偏向鎖位,兩位是鎖標志位
-
此時線程A訪問該對象,因為A是第一個訪問該對象的線程,此時沒有其它線程競爭,o的markword的前54位指向了當前線程,此時為偏向鎖.
-
當線程A添加了偏向鎖之后,線程B也來訪問o對象,A,B兩個線程競爭.這兩個線程分別在各自的線程棧中生成一個Lock Record,以CAS的方式對o競爭加鎖,假設A成功,則o的markword指向線程A的Lock Record,線程B處于自旋狀態.此時o上添加的是輕量級鎖也叫自旋鎖,也叫無鎖.
-
當線程B自選次數超過10次,則向操作系統內核態申請重量級鎖資源
?
?