多線程(三)

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();
    }
}
相關文章
相關標籤/搜索