摘要:無鎖算法在并發編程中,提供了很多并發編程工具類。在包下有一個包叫,下面所有的工具,我們都稱為它是無鎖算法的一種實現。相對于有鎖算法來說,無鎖算法不會使等待線程休眠或者阻塞。
無鎖算法
在Java并發編程中,Java提供了很多并發編程工具類。在JUC包下有一個包叫atomic,下面所有的工具,我們都稱為它是無鎖算法的一種實現。
相對于有鎖算法來說,無鎖算法不會使等待線程休眠或者阻塞。它的具體原理是這樣的:
比如有一個變量x,初始值為0
int x = 0
現在有兩個線程A-Thread,B-Thread同時去修改變量 x,是x++,正確執行的情況下,x最后結果應該是2
利用無鎖算法的實現是這樣的
public final int incrementAndGet() { for (;;) { int current = get(); int next = current + 1; # compareAndSet會原子性的執行先判斷current和內存中的值是否相等,如果不等就失敗返回false if (compareAndSet(current, next)) return next; } }
在這個列子中,利用無鎖算法,當線程需要重新設置變量的值時,都會攜帶當前值current和新值new去調用 `compareAndSet()` 方法,該方法在執行set操作會原子性的執行 先判斷current和內存中的值是否相等,如果不等就失敗返回false,否則就會把值設置為新值。
這個原子性的動作_先判斷current和內存中的值是否相等,如果不等就失敗返回false_的語句需要操作系統支持這種指令語句。所以incrementAndGet方法是一個原子性的操作方法
所以當A-Thread、B-Thread同時調用incrementAndGet去修改x值,x值的變化過程只會是
0->1->2
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64653.html
摘要:測試吞吐量的時候,是通過每一種實現都重復測試超過次,每一次都運行秒以上,以保證系統足夠預熱,下面的結果都是第次之后平均每秒吞吐量。以我的經驗看,教學和開發中的無鎖算法,不僅能顯著改善吞吐量同時他們也提供更低的延遲。 上周在由Heinz Kabutz通過JCrete?組織的開放空間會議(unconference)上,我參加一個新的java規范 JSR166?StampedLock 的審查...
摘要:在本例中,講述的無鎖來自于并發包我們將這個無鎖的稱為。在這里,我們使用二維數組來表示的內部存儲,如下變量存放所有的內部元素。為什么使用二維數組去實現一個一維的呢這是為了將來進行動態擴展時可以更加方便。 我們已經比較完整得介紹了有關無鎖的概念和使用方法。相對于有鎖的方法,使用無鎖的方式編程更加考驗一個程序員的耐心和智力。但是,無鎖帶來的好處也是顯而易見的,第一,在高并發的情況下,它比有鎖...
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據一系列常見的多線程設計模式,設計了并發包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發于一世流云專欄:https...
摘要:因為多線程競爭鎖時會引起上下文切換。減少線程的使用。舉個例子如果說服務器的帶寬只有,某個資源的下載速度是,系統啟動個線程下載該資源并不會導致下載速度編程,所以在并發編程時,需要考慮這些資源的限制。 最近私下做一項目,一bug幾日未解決,總惶恐。一日頓悟,bug不可怕,怕的是項目不存在bug,與其懼怕,何不與其剛正面。 系列文章傳送門: Java多線程學習(一)Java多線程入門 Jav...
閱讀 3061·2021-10-27 14:16
閱讀 2878·2021-09-24 10:33
閱讀 2284·2021-09-23 11:21
閱讀 3228·2021-09-22 15:14
閱讀 811·2019-08-30 15:55
閱讀 1675·2019-08-30 15:53
閱讀 1741·2019-08-29 11:14
閱讀 2190·2019-08-28 18:11