1.關鍵字volatile :強制從公共堆棧中取得變量的值,而不是從線程私有數據棧中取得變量的值.(不具備原子性)ide
JVM中存在一個主內存(Java Heap Memory),Java中全部變量都儲存在主存中,對於全部線程都是共享的。每一個線程都有本身的工做內存(Working Memory),工做內存中保存的是主存中某些變量的拷貝,線程對全部變量的操做都是在工做內存中進行,線程之間沒法相互直接訪問,變量傳遞均須要經過主存完成。線程
Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。並且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任什麼時候刻,兩個不一樣的線程老是看到某個成員變量的同一個值。 內存
例子:class
public class MyThread extends Thread{ public static int count; private static void addCount(){ for (int i = 0; i <100 ; i++) { count++; } System.out.println("count="+count); } @Override public void run() { addCount(); } }
public class Run { public static void main(String[] args) { MyThread[] t=new MyThread[100]; for (int i = 0; i <100 ; i++) { t[i]=new MyThread(); } for (int i = 0; i < 100; i++) { t[i].start(); } } /*output:結果太長,截取有問題的部分 count=7100 count=6900 count=6900 count=7200 count=7300 */ }
分析:線程沒有及時將工做內存的值寫入主內存變量
解決方法:方法
public class MyThread extends Thread{ volatile public static int count; private static void addCount(){ for (int i = 0; i <100 ; i++) { count++; } System.out.println("count="+count); } @Override public void run() { addCount(); } }