當要更新乙個變數的時候,只有當變數的預期值a和記憶體位址v當中的實際值相同的時候,才會將記憶體位址v對應的值修改為b
舉個栗子
在乙個記憶體位址為v記憶體中,儲存著變數值10(即此時a=10)
此時,來了乙個執行緒a,想對該變數進行增加1操作(即此時對執行緒a來說:a=10,b=11)
但是,當執行緒a操作之前,被執行緒b插入率先將該變數進行修改成11(即此時a=11)
接著,等執行緒a想來修改的時候,通過記憶體位址v獲取當前最新的值與自身執行緒的預期值進行比對(此時執行緒a的a=10),發現不一樣,導致更新失敗
執行緒a重新獲取記憶體位址v的當前值,並重新計算想要修改的新值,即自旋操作。(此時對執行緒a來說,a=11,b=12)
這一次沒有其他執行緒的干擾,執行緒a通過獲取記憶體位址v的實際值,成功比較後,並且將記憶體位址v的值修改成12
--- 優點
由於synchronized是個重量級別的鎖,每次使用會引起使用者態和核心態之間進行轉換,在轉換之間需要耗費很多的處理時間,所以,如果使用cas機制,在併發不是很多的情況下,可以減少使用者態和核心態進行切換,從而提高系統效能。
---缺點
舉個栗子(aba問題)
小埋去存銀行卡有200塊錢,去提款機取錢100,恰巧機器有點問題,在進行取款提交操作後台開啟了兩個執行緒a和b(200->100)
執行緒a成功執行,而且執行緒b阻塞了,此時小埋銀行卡的餘額為100
此時,小埋的哥哥給她卡了打了100塊,此時小埋銀行卡的餘額為200
然後,執行緒b此時就又開始執行了,發現卡里的餘額200和自身執行緒餘額期待值一樣,進行修改(200->100)
最後,小埋就只能去找櫃檯尋求幫助了,因為正常情況下,她現在的卡里應該還有200塊
如何解決aba問題:
對記憶體中的值加個版本號,在比較的時候除了比較值還的比較版本號。
六 多執行緒 CAS
鎖的開銷極大。在某些場景,如保證乙個變數的 read modify write操作的原子性。這種場景可以通過使用cas解決而不需要用到鎖。unsafe類中通過cas修改int型別變數原始碼。var1 atomicinteger物件 var2 記憶體偏移量 var4 增加的值 var5 獲取的變數原值...
多執行緒 事件機制
多執行緒 事件機制 即執行緒b的啟動需要等待執行緒a的某個訊號,如果等待到資訊則開始執行,如下,摘自 精通windows api 精通windows api 示例 event.c 7.2.1 演示使用event同步執行緒 標頭檔案 include include 常量定義 define numthr...
JAVA多執行緒機制
1,使用執行緒子類建立執行緒 繼承主題,重寫執行方法。2,使用執行緒類直接建立執行緒物件 用宣告執行緒 生成目標物件,建立目標物件.b b new b 建立執行緒,放入目標物件a new thread b 實現了runnable介面 重寫執行方法 1,啟動 啟動執行緒,只有處於新建狀態下的執行緒才能...