java架構師詳解:分佈式系統、微服務架構的一致性和冪等性問題!
前言什麼是分佈式系統?關於這點其實並沒有明確且統一的定義。在我看來,只要一個系統滿足以下幾點就可以稱之為分佈式系統系統由物理上不同分佈的多個機器節點組成系...
在我們編程的時候i++是一個經常使用的方法,但是,我們在使用i++的時候,也會產生一些問題,特別是在多線程編程的時候,由於i++不是一個原子操作,所以容易導致我們在編程的時候產生數據不安全的情況,下面我們看一個例子:
我們寫一個簡單的線程類,裡面有一個方法,就是簡單的將一個值”++”100次之後再打印出來。
然後我們在客戶端產生100條線程,來執行:
輸出結果如下:
最終count的值不是10000而是6457(實際的值會因為運行情況而變)
這樣恰好說明了在多線程的時候i++出現了數據衝突。
因為在這個例子裡面我們使用了volatile關鍵字修飾count。所以在進行i++的時候。總共分為三步:
1)從內存中讀取i的值
2)將i++;
3)將i的值寫回內存中。
如果我們從1)中讀取數據之後準備計算i的值的時候,另一個線程正好又改變了i的值,這個時候i的值就出現了數據不一致的情況。所以我們在計算i++的時候,最好要對i進行加鎖。如下所示:
加鎖之後程序輸出正常:
count值最後變為10000。以上,就是我們在多線程編程的時候要注意的i++的問題。