Java_對線程安全的解釋

線程安全問題前提:

  1. 多個線程在操作共享數據;
  2. 操作共享數據的線程代碼有多條;

比如說:

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值已經出現了偏差。

       當然這都是隨機的;

總結:

放一個線程在執行操作共享數據的多條代碼過程中,其他代碼也參與了運算。導致這種情況的發生。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章