執行緒同步之可見性試驗

2021-08-28 00:26:24 字數 917 閱讀 7365

執行緒同步的作用包含2個方面:

1.原子性:這裡的原子性跟資料庫事務的原子性相似,不論多個可變狀態變數還是單個可變狀態變數,要保證併發操作的正確性,必須保證每個執行緒拿到的資料都是正確的,不存在過期資料或者部分過期資料。最常見的違反原子性錯誤的情形是:"select-update"、"check-use"、"read-change-write",由於最終使用資料要依賴資料以前的狀態,不是乙個原子的操作,就容易因為執行緒執行時序的不同而導致結果不同。

2.可見性:可見性是指乙個執行緒的資料狀態對另乙個執行緒是不是可見的,如果不可見,則a執行緒對共享資料的操作結果,b執行緒是拿不到的。

public class sharestatetest 

system.out.println(thread.currentthread().getid() + "it's ready! num=" + num);}}

}.start();

new thread() catch (interruptedexception e)

while(!ready)}}

}.start();}}

這裡涉及到多執行緒除錯,我用的是idea,設定好斷點,滑鼠右鍵,出現debug選擇框,按下圖配置就可以進行多執行緒除錯,iead還可以設定進入斷點的條件。

然後,開啟dubug模式,可以看到執行緒不是並行執行的,而是受到執行緒排程器的排程,起初一直執行第乙個執行緒,然後,過了幾個時間片,開始執行第二個執行緒,這時ready已經被置為true了,但是第乙個執行緒依然看不到ready的值變為true,又過了幾輪的交替執行,才看到第乙個執行緒列印了第二個while迴圈後邊的輸出,我想這是因為第二個執行緒將ready的值寫回主記憶體需要時間吧!

多執行緒學習 執行緒可見性

每個執行緒都有自己的空間去暫存資料 當有乙份資料在a,b執行緒之間共享 那麼在a執行緒中改變了b是不會馬上知道的 example 共享物件 多個物件在沒有同步的情況下會發生可見性的錯誤 public class sharingobjects1 system.out.println thread th...

Java多執行緒可見性(一)

一 記憶體可見性 執行緒對共享變數的修改,可以及時的被其他執行緒看到。那何為共享變數呢?就是在多個執行緒的工作記憶體中存在 如下圖所示 所謂的共享變數就是主記憶體中名為s的變數,程式中所有的變數都會儲存在主記憶體中 其他執行緒也會有自己的工作記憶體,此工作記憶體的作用是為執行緒與主記憶體之間建立橋梁...

執行緒安全性 可見性

執行緒交叉執行 重排序結合執行緒交叉執行 共享變數更新後的值沒有在工作記憶體與主存間及時更新 執行緒解鎖前,必須把共享變數的最新值重新整理到主記憶體 執行緒加鎖時,將清空工作記憶體中共享變數的值,從而使用共享變數時需要從主存中重新讀取最新的值 注意加鎖和解鎖是同一把鎖 通過加入 記憶體屏障和禁止重排...