Java的原子操作
0 相關源碼
1 競態條件與臨界區
多個線程訪問了相同的資源,向這些資源做了寫操作時,對執行順序有要求。
1.1 臨界區
incr 方法內部就是臨界區域,關鍵部分代碼的多線程并發執行,會對執行結果產生影響。
1.2 競態條件
可能發生在臨界區域內的特殊條件。多線程執行incr方法中的i++關鍵代碼時,產生了競態條件
2 共享資源
如果一段代碼是線程安全的,則它不包含競態條件。只有當多個線程更新共享資源時,才會發生競態條件
棧封閉時,不會在線程之間共享的變量,都是線程安全的
局部對象引用本身不共享, 但是引用的對象存儲在共享堆中。如果方法內創建的對象,只是在方法中傳遞,并且不對其他線程可用,那么也是線程安全的
3 不可變對象
創建不可變的共享對象來保證對象在線程間共享時不會被修改,從而實現線程安全。
實例被創建,value變量就不能再被修改,這就是不可變性。
1 原子操作的定義
原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序不可以被打亂,也不可以被切割而只執行其中的一部分(不可中斷性)。
將整個操作視作一個整體,資源在該次操作中保持一致,這是原子性的核心特征。
存在競態條件,線程不安全,需要轉變為原子操作才能安全。方式:循環CAS、鎖;
上例只是針對一個變量的原子操作改進,我們也可以實現更大邏輯的原子操作。
推薦閱讀
Java的CAS樂觀鎖原理解析
Java 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。