public
class
Counter {
public volatile
static
int
count =
0
;
public
static
void
inc() {
//這里延遲1毫秒,使得結果明顯
try
{
Thread.sleep(
1
);
}
catch
(InterruptedException e) {
}
count++;
}
public
static
void
main(String[] args) {
//同時啟動1000個線程,去進行i++計算,看看實際結果
for
(
int
i =
0
; i <
1000
; i++) {
new
Thread(
new
Runnable() {
@Override
public
void
run() {
Counter.inc();
}
}).start();
}
//這里每次運行的值都有可能不同,可能為1000
System.out.println(
"運行結果:Counter.count="
+ Counter.count);
}
}
這里運行結果依然不是期望的1000,主要原因簡單解釋如下:
對于volatile修飾的變量,jvm虛擬機只是保證從主內存加載到線程工作內存的值是最新的
例如假如線程1,線程2 在進行read,load 操作中,發現主內存中count的值都是5,那么都會加載這個最新的值
在線程1堆count進行修改之后,會write到主內存中,主內存中的count變量就會變為6
線程2由于已經進行read,load操作,在進行運算之后,也會更新主內存count的變量值為6
導致兩個線程及時用volatile關鍵字修改之后,還是會存在并發的情況。