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 每秒響應請求數。在網際網路領域,這個指標和吞吐量區分的沒有這麼明顯。網際網路分布式架構設計,提高系統併發能力的方...