synchronized案例與原理分析

2021-10-12 06:49:35 字數 1026 閱讀 3507

private static volatile int j=100;

public static void main(string args) throws interruptedexception

private static class updatej extends thread

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"第二次從資料庫中讀取j成了:"+getj());

對上面案例進行優化如下:

private static  volatile int j=100;

public static void main(string args) throws interruptedexception

private static class updatej extends thread

@override

public void run() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"第二次從資料庫中讀取j成了:"+getj());}}

synchronized可以保證多個執行緒執行的順序,保證了有序性,在獲取變數的時候會將本地記憶體刪掉.然後從主記憶體重新獲取,保證了可見性, 執行緒讀寫完全隔離,從而保證了原子性.

synchronized與volatile關鍵字

volatile保證其他執行緒對這個變數操作時是立即可見的,即操作的是從記憶體中讀取的最新值 無法保證原子性 只能修飾變數 public class test public static void main string args throws exception start 控制台輸出 使用場景 ...

執行緒與併發 synchronized

多執行緒與高併發 當我們對乙個數字進行遞增操作時,如果兩個程式同時訪問,第乙個執行緒讀到count 0,並對其 1,在自己執行緒內部的記憶體裡還沒有寫回去的時候 第二個執行緒讀到的count也是0,並 1寫回去 但是程式明明對count進行了兩次 1操作,但結果還是1。那麼我們對這個遞增過程加上一把...

synchronized與鎖公升級

當乙個共享資源有可能被多個執行緒同時訪問並修改的時候,需要用鎖來保證資料的正確性。請看下圖 執行緒a和執行緒b分別往同乙個銀行賬戶裡面新增貨幣,a執行緒從記憶體中讀取 read 當前賬戶金額 0 到執行緒a的本地棧,進行 100的操作後,這時b執行緒也從記憶體中讀取當前金額 0 到執行緒b的本地棧,...