轉載請注明原文地址:http://www.cnblogs.com/ygj0930/p/6561376.html
一:悲觀鎖
悲觀鎖,就是不管是否發生多線程沖突,只要存在這種可能,就每次訪問都加鎖,加鎖就會導致鎖之間的爭奪,有爭奪就會有輸贏,輸者等待。
syncrhoized是一種獨占鎖,即:占用該鎖的線程才可以執行,申請該鎖的線程就只能掛起等待,直到占用鎖的線程釋放鎖才喚醒,拿到鎖並執行。由於在進程掛起和恢復執行過程中存在着很大的開銷,並且當一個線程正在等待鎖時,它不能做任何事。所以syncrhoized是一種悲觀鎖,凡是用syncrhoized加了鎖的多線程之間都會因鎖的爭奪結果導致掛起、喚醒等開銷。
二:樂觀鎖
獲得鎖后一直持有鎖以防本線程再次申請該鎖造成無謂的解鎖再加鎖開銷,或者假設沒有沖突而去完成同步代碼塊如果沖突再循環重試,或者采取申請鎖失敗后不立刻掛起而是稍微等待再次嘗試獲取 等待策略,以減少線程因為掛起、阻塞、喚醒(發生CPU的調度切換) 而造成的開銷。
偏向鎖、輕量級鎖(CAS輪詢)、自旋鎖 就是基於上述思路的樂觀鎖。
在多線程的加鎖機制中,JVM會首先嘗試樂觀鎖,失敗后才調用悲觀鎖。
