併發原本就是個有意思的問題,尤爲是如今又流行這麼一句話:「高帥富加機器,窮矮搓搞優化」。從這句話能夠看到,不管是高帥富仍是窮矮搓都須要深刻理解併發編程,高帥富加多了機器,須要協調多臺機器或者多個CPU對共享資源的訪問,所以須要瞭解併發,窮矮搓搞優化須要編寫各類多線程的代碼來壓榨CPU的計算資源,讓它在同一時刻作更多的事情,這個更須要了解併發。html
在我前一篇關於併發的文章http://my.oschina.net/chihz/blog/54731中提到過管程,管程的特點是在編程語言中對併發的細節進行封裝,使程序員能夠直接在語言中就獲得併發的支持,而沒必要本身去處理一些像是控制信號量之類容易出錯且繁瑣的細節問題。一些語言是經過在編譯時解開語法糖的方式去實現管程,但Java在編譯後生成的字節碼層面上對併發仍然是一層封裝,好比syncrhonized塊在編譯以後只是對應了兩條指令:monitorenter和monitorexit。更多的併發細節是在JVM運行時去處理的,而不是編譯。這篇文章主要是針對JVM處理併發的一些細節的探討。java
1
|
boolean open= true;
|
1
2
3
4
|
//線程A
resource.close();
open = false;
|
1
2
3
4
5
|
//線程B
while(open) {
doSomethingWithResource(resource);
}
|
1
2
|
private int a;
private int b;
|
1
2
|
a = 1;
b = 2;
|
1
2
|
b = 2;
a = 1;
|
1
2
|
context = loadContext();
inited = true;
|
1
2
3
4
|
while(!inited ){
sleep
}
doSomethingwithconfig(context);
|
1
2
|
inited = true;
context = loadContext();
|
這篇文章簡單的介紹了Java內存模型、內存可見性和指令重排序。不過最後看來其實主要是在解釋volatile這個關鍵字,我的感受volatile關鍵字是Java當中最使人困惑和最難理解的關鍵字。相對於synchronized塊的代碼鎖,volatile應該是提供了一個輕量級的針對共享變量的鎖,當咱們在多個線程間使用共享變量進行通訊的時候須要考慮將共享變量用volatile來修飾,對於須要使用volatile的各類情景,看到IBM Developer Works上有一篇文章總結的很不錯,推薦一下: http://www.ibm.com/developerworks/cn/java/j-jtp06197.html程序員