摘要:線程把的值放在中。線程執行,得到的為。,,獨占鎖,會導致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。可見性,不保證原子性。樂觀鎖,不適用鎖的情況下實現多線程的變量同步。性能問題在并發量較高的情況下,如果一直不成功,會一直增加的開銷。
cas原理
cas全稱Compare and swap,比較和交換的意思。原子操作,需要硬件的支持。
三個基本操作數:內存地址V,舊的預期值A,要修改的新值B。
舉個線程A想執行相加的例子。
內存地址V有個值是1。
線程A把V的值放在A中。
線程A執行V+2,得到的3為B。
把A和V的值比較,如果不一樣,重新執行2的步驟。
如果一樣,把V的值替換為B。
synchronized,volatile,cassynchronized:獨占鎖,會導致其他所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。
volatile:可見性,不保證原子性。
cas:樂觀鎖,不適用鎖的情況下實現多線程的變量同步。
缺點ABA問題:在上面例子中,如果V的值是1,被B線程變成2,再被A線程變成1,那么對于A線程來說,還是當做沒有變化。解決的辦法就是加版本號。
性能問題:在并發量較高的情況下,如果一直不成功,會一直增加CPU的開銷。
只能保證一個共享變量的原子操作
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75351.html
摘要:作用通過版本號解決的問題。示例當前值,預設當前版本號結果當前值,預設當前版本號結果當前值當前版本號運行結果如下這里用休眠,讓線程和線程一次執行,通過結果可以看出來,線程執行成功,而線程執行失敗。 作用 通過版本號解決ABA的問題。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...
摘要:示例運行結果如下在多線程無鎖的情況下,總是小于等于,而因為原子性的方法總是等于。 示例 public class AtomicDemo { static int num1 = 0; static AtomicInteger num2 = new AtomicInteger(0); static class Thread1 extends Thread { ...
摘要:作用通過版本號解決的問題。示例當前值,預設當前版本號結果當前值,預設當前版本號結果當前值當前版本號運行結果如下這里用休眠,讓線程和線程一次執行,通過結果可以看出來,線程執行成功,而線程執行失敗。 作用 通過版本號解決ABA的問題。 示例 public class AtomicStampedReferenceDemo { static AtomicStampedReference...
摘要:顯示鎖和內置鎖內置鎖優勢代碼簡潔不會因為沒釋放鎖,導致鎖泄露。顯示鎖優勢靈活性強,鎖的獲取可以被中斷,可以嘗試獲取鎖。接口接口主要方法如下獲取鎖嘗試獲取鎖,表示未加鎖的情況。會進行搶鎖操作,如果獲取不到鎖,也會進入阻塞隊列等到喚醒。 顯示鎖和內置鎖 內置鎖(Synchronized)優勢 代碼簡潔 不會因為沒釋放鎖,導致鎖泄露。 顯示鎖(Lock)優勢 靈活性強,鎖的獲取可以被中...
摘要:原理全稱,當線程去獲取資源的時候,會根據狀態值來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經釋放,如果釋放,則獲取資源。 原理 全稱AbstractQueuedSynchronizer,當線程去獲取資源的時候,會根據狀態值state來判斷是否有鎖,如果有鎖,則加入到鏈表,鏈表里的線程,通過自旋,判斷資源是否已經釋放,如果釋放,則獲取資源。 AQS結構 ...
閱讀 3712·2023-04-25 17:45
閱讀 3426·2021-09-04 16:40
閱讀 999·2019-08-30 13:54
閱讀 2126·2019-08-29 12:59
閱讀 1396·2019-08-26 12:11
閱讀 3273·2019-08-23 15:17
閱讀 1516·2019-08-23 12:07
閱讀 3878·2019-08-22 18:00