Java中,對多線程訪問同一變量(併發訪問)的認識

在Java中,若是啓動多個線程對同一個對象或者變量時候,在沒有安全保護前提下有可能會拋出並異常java

java.util.ConcurrentModificationException安全

當方法檢測到對象的併發修改,但不容許這種修改時,拋出此異常(併發異常)併發

解決方法:優化

  • 在對象/變量前加上volatile。Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。Java語言規範中指出:爲了得到最佳速度,容許線程保存共享成員變量的私有拷貝,並且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。這樣當多個線程同時與某個對象交互時,就必需要注意到要讓線程及時的獲得共享成員變量的變化。而volatile關鍵字就是提示JVM:對於這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者爲常量時,沒必要使用。因爲使用volatile屏蔽掉了JVM中必要的代碼優化,因此在效率上比較低,所以必定在必要時才使用此關鍵字
  • 將對象/變量加上鎖synchronized修飾。在線程中,使用同步方法或者同步塊。
  • 使用帶有線程安全的線程。如:繼承TimerTask類實現線程,用Timer.schedule啓動線程 。
相關文章
相關標籤/搜索