java多線程 實例變量與線程安全

自定義線程類中的實例變量針對其他線程可以有共享和不共享之分。當每個線程都有給的實例變量時,就是變量不共享。共享數據的情況就是多個線程可以訪問同一個變量,

public class MyThread extends Thread{

    private int count = 5;

    @Override
    public void run() {
        count--;
        System.out.println("線程:"+Thread.currentThread().getName()+",count="+count);
    }
}

以上代碼定義了一個線程類,通過count變量減一,達到線程之間參數共享的效果,運行代碼如下:

public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread a = new Thread(myThread,"a");
        Thread b = new Thread(myThread,"b");
        Thread c = new Thread(myThread,"c");
        Thread d = new Thread(myThread,"d");
        Thread e = new Thread(myThread,"e");
        Thread f = new Thread(myThread,"f");
        a.start();b.start();c.start();d.start();e.start();f.start();

    }

打印效果如下:

顯示不是我們想要的結果,在某些JVM中,i--的操作要分爲3步:1.取得原來的變量的值,2.計算i-1,3.對i進行賦值

在這三個步驟中,如果有多個線程同時訪問,那麼一定會出現非線程安全問題,解決方案就是使用synchronized 同步關鍵字,使各個線程配對執行run()方法,修改後的run方法:

public class MyThread extends Thread{

    private int count = 5;

    @Override
    synchronized public void run() {
        count--;
        System.out.println("線程:"+Thread.currentThread().getName()+",count="+count);
    }
}

執行結果如下:

這樣就可以達到我們預期的效果

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