上次總結了Synchronized機制下的鎖的種類和原理,這次總結一下幾種鎖的適用場景。
偏向鎖
一個線程獲取某個對象的偏向鎖的成本是很低的,只需把對象頭的偏向線程id改為自己就好,如果偏向線程id已經為自己則直接獲得鎖。當偏向鎖的獲取出現競爭,則偏向鎖可能會升級為輕量級鎖。
根據這些,可以看出偏向鎖適合無競爭、競爭小的場景,理想的情況為總是由同一個線程去訪問同步塊、獲取某個對象的鎖。實際應用中,很多時候情景也確實是這樣的。
輕量級鎖
輕量級鎖由偏向鎖升級而來,特點是獲取輕量級鎖的是通過CAS原子操作進行的,失敗的線程不會進入阻塞,而是自旋嘗試再次CAS去獲取鎖。若失敗的次數過多,則輕量級鎖會膨脹為重量級鎖。因為自旋也是要消耗cpu的,不能讓線程一直自旋下去。
根據這些,可以看出 輕量級鎖最適合場景是追求響應時間的情景,理想的情況是少量線程交替訪問同步塊、獲取鎖。若多個線程訪問同步塊的時間重合的比驕密集就會發生很多自旋造成cpu資源浪費。
重量級鎖
重量級鎖是輕量級鎖受到激烈競爭時,為防止cpu被自旋的線程浪費膨脹而來,因此重量級鎖肯定是應付大量線程同時訪問同步塊的情景。讓申請鎖失敗的線程阻塞后,cpu的負擔會減小不少,因此數據的吞吐量也就上來了。
匯總表格:

