非阻塞同步算法與CAS(Compare and Swap)無鎖算法

CAS html

http://www.javashuo.com/article/p-pbpgnwjw-eo.html緩存

 

鎖是用來作併發最簡單的方式,固然其代價也是最高的。內核態的鎖的時候須要操做系統進行一次上下文切換,加鎖、釋放鎖會致使比較多的上下文切換和調度延時,等待鎖的線程會被掛起直至鎖釋放。在上下文切換的時候,cpu以前緩存的指令和數據都將失效,對性能有很大的損失。操做系統對多線程的鎖進行判斷就像兩姐妹在爲一個玩具在爭吵,而後操做系統就是能決定他們誰能拿到玩具的父母,這是很慢的。用戶態的鎖雖然避免了這些問題,可是其實它們只是在沒有真實的競爭時纔有效。多線程

Java在JDK1.5以前都是靠synchronized關鍵字保證同步的,這種經過使用一致的鎖定協議來協調對共享狀態的訪問,能夠確保不管哪一個線程持有守護變量的鎖,都採用獨佔的方式來訪問這些變量,若是出現多個線程同時訪問鎖,那第一些線線程將被掛起,當線程恢復執行時,必須等待其它線程執行完他們的時間片之後才能被調度執行,在掛起和恢復執行過程當中存在着很大的開銷。鎖還存在着其它一些缺點,當一個線程正在等待鎖時,它不能作任何事。若是一個線程在持有鎖的狀況下被延遲執行,那麼全部須要這個鎖的線程都沒法執行下去。若是被阻塞的線程優先級高,而持有鎖的線程優先級低,將會致使優先級反轉(Priority Inversion)。併發

樂觀鎖與悲觀鎖

相關文章
相關標籤/搜索