Java多線程編程的時候一個變量自加導致的問題

編程語言 Java 科技 愛碼仕迪巴閣 2017-05-29

在我們編程的時候i++是一個經常使用的方法,但是,我們在使用i++的時候,也會產生一些問題,特別是在多線程編程的時候,由於i++不是一個原子操作,所以容易導致我們在編程的時候產生數據不安全的情況,下面我們看一個例子:

我們寫一個簡單的線程類,裡面有一個方法,就是簡單的將一個值”++”100次之後再打印出來。

Java多線程編程的時候一個變量自加導致的問題

然後我們在客戶端產生100條線程,來執行:

Java多線程編程的時候一個變量自加導致的問題

輸出結果如下:

Java多線程編程的時候一個變量自加導致的問題

最終count的值不是10000而是6457(實際的值會因為運行情況而變)

這樣恰好說明了在多線程的時候i++出現了數據衝突。

因為在這個例子裡面我們使用了volatile關鍵字修飾count。所以在進行i++的時候。總共分為三步:

1)從內存中讀取i的值

2)將i++;

3)將i的值寫回內存中。

如果我們從1)中讀取數據之後準備計算i的值的時候,另一個線程正好又改變了i的值,這個時候i的值就出現了數據不一致的情況。所以我們在計算i++的時候,最好要對i進行加鎖。如下所示:

Java多線程編程的時候一個變量自加導致的問題

加鎖之後程序輸出正常:

Java多線程編程的時候一個變量自加導致的問題

count值最後變為10000。以上,就是我們在多線程編程的時候要注意的i++的問題。

相關推薦

推薦中...