在了解輕量級鎖之前,首先要知道什么是CAS
CAS--Compare And Swap 比較並交換--通過比較傳入的舊值和原內存位置中的值比較,來決定是不是要更新數據。
CAS的語義是“我認為V的值應該為A,如果是,那么將V的值更新為B,否則不修改並告訴V的值實際為多少”,CAS是項 樂觀鎖 技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。
CAS指令需要三個操作數,分別為內存位置(在java中可以理解為變量在內存中的位置,用V標識)、舊的預期值(用A標識)、新值(用B 標識)。當CAS指令執行的時候,當且僅當V符合預期值A,處理器才會使用新值B更新V,否則他就不執行更新,但是是否更新了V,都會返回V的舊值,而且這一系列的操作過程都是原子性的。
1 int compare_and_swap (int* reg, int oldval, int newval) 2 { 3 ATOMIC(); 4 int old_reg_val = *reg; 5 if (old_reg_val == oldval) 6 *reg = newval; 7 END_ATOMIC(); 8 return old_reg_val; 9 }
具體詳細介紹可以參見:http://www.tuicool.com/articles/zuui6z
其中百度百科上面說的也可以理解其原理:
compare and swap,解決多線程並行情況下使用鎖造成性能損耗的一種機制,CAS操作包含三個操作數——內存位置(V)、預期原值(A)和新值(B)。如果內存位置 的值與預期原值相匹配,那么處理器會自動將該位置值更新為新值。否則,處理器不做任何操作。無論哪種情況,它都會在CAS指令之前返回該位置的值。CAS 有效地說明了“我認為位置V應該包含值A;如果包含該值,則將B放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。
另外要理解輕量級鎖,還需要知道MarkWord ---

這其中lock record 稱之為鎖記錄的空間,如果上面圖中ptr to lock record 的標志位為01,表示該對象沒有鎖定,那么虛擬機首先將在當前線程幀棧中建立一個lock record 的空間,用於存儲當前對象的markword 的一份拷貝;然后使用CAS操作嘗試將mark-word更新為指向lock record的指針,如果更新成功那么就說明該線程已經擁有了該對象的使用權限,那么就會將上面ptr to lock record 的標志位設置為00證明該對象正在處於輕量級鎖定狀態。
當線程使用該對象的時候,首先要檢查該標志位是不是處於輕量級鎖定狀態,如果是證明有線程正在使用該對象。
同樣在解鎖的過程中,使用的正是CAS方式,他會嘗試將原來在lock record 的mard word 和 對象 頭部的mark word 替換回來。如果替換成功表示,眾線程已經完成了同步操作,如果沒有的話,表示還有其他線程嘗試過獲取該鎖,那么就要喚醒被掛起的線程。

