分布式與高併發 可見性問題 volatile(一)

2021-10-10 20:08:41 字數 2138 閱讀 8479

1.1、引出可見性問題

public

class

volatiledemo

system.out.

println

("迴圈結束:"

+i);})

.start()

; thread.

sleep

(1000);

stop=

false;}

}

1.2、執行結果

1.3、執行結果分析

可見迴圈一直未結束,沒有輸出:system.out.println(「迴圈結束:」+i);所以主線程中stop=false,對子執行緒 while(stop) 不可見,這就是乙個可見性問題

2.1 **實現

public

class

volatiledemo})

.start()

; thread.

sleep

(100);

stop=

false;}

}

2.2、執行結果

2.3 結果分析

執行緒正常結束了,那麼print 是如何促成了可見性問題的解決呢?

print 方法主要分為兩步

io操作:io阻塞也會有影響,**佐證(new file()),也會使**正常結束

public

class

volatiledemo})

.start()

; thread.

sleep

(100);

stop=

false;}

}

synchronized:鎖的釋放會強制把工作記憶體中寫的操作同步到主記憶體中,意味著stop=false,會把stop的值同步到主記憶體,while的下一次迴圈會讀到stop=false;對這個結論進行一下佐證,下面**執行結果也會正常結束,所以結論就是 synchronized加鎖和釋放鎖會同步主記憶體

public

class

volatiledemo}}

).start()

; thread.

sleep

(100);

stop=

false;}

}

綜上所述 print即實現了syn和io操作,所以解決了可見性問題

public

class

volatiledemo

catch

(interruptedexception e)}}

).start()

; thread.

sleep

(100);

stop=

false;}

}

4.1、**實現
public

class

volatiledemo

system.out.

println

("迴圈結束:"

+i);})

.start()

; thread.

sleep

(100);

stop=

false;}

}

4.2、執行結果

4.3、結果分析

程式正常結束,輸出了資訊,說明子迴圈中捕獲到了stop=false

綜上案例可見我們可以通過volatile關鍵字去解決可見性問題,這樣也就不需要關心執行緒中是否有print或者sleep等**操作

高併發與分布式

一提到高併發很多人就會想到分布式,那麼二者到底有什麼區別呢?併發和分布是完全不同的概念。分布是將任務分發到不同的點上去,一般分布式最多的就是分布式計算。通過某種分布式程式設計方式,在不同的系統上利用各自的cpu,記憶體等進行計算,將結果匯集至控制中心,進行處理。比如最有名的就是分布式計算天氣的氣候阿...

015 可見性問題與volatile

一 概述 可見性問題 什麼是可見性問題?可見性問題的原因是什麼?快取之中存在共享變數的副本,在有些時候,因為來不及維護副本和實體的一致性可能造成問題,這種問題就是可見性問題.注意 當我們解決的原子性的同時也就完成了可見性的問題的解決.二 可見性性問題的例子 public class visiable...

分布式,避免高併發

高併發 high concurrency 是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。吞吐量 單位時間內處理的請求數量。qps 每秒響應請求數。在網際網路領域,這個指標和吞吐量區分的沒有這麼明顯。網際網路分布式架構設計,提高系統併發能力的方...