線程安全問題前提:
- 多個線程在操作共享數據;
- 操作共享數據的線程代碼有多條;
比如說:
public Ticket implements Runnable{
private int count = 0;//共享數據
public void run() {
count ++;
System.out.println(count);
}
}
當多個線程執行該線程任務對象的時候會出現這種問題:
(四個線程 情況可能不同) 理想情況應該是1 . 2 . 3. 4.
是因爲:
單線程運行起來是沒有任何問題的,但是當出現多條線程併發訪問這個方法的時候,問題就出現了。
首先對於下count+1這個操作:進入這個方法之後首先要讀取count的值,然後修改count的值,最後才把這把值賦值給count,總共包含了三步過程:“讀取”一>“修改”一>“賦值”,既然這個過程是分步的,所以當線程A讀取到count的值,但是還沒有進行修改的時候,線程B已經進來了,再執行該方法,然後線程B讀取到的還是count爲1的值,操作完後,CPU在切換到其他線程,正因爲如此所以我們的count值已經出現了偏差。
當然這都是隨機的;
總結:
放一個線程在執行操作共享數據的多條代碼過程中,其他代碼也參與了運算。導致這種情況的發生。