自定義線程類中的實例變量針對其他線程可以有共享和不共享之分。當每個線程都有給的實例變量時,就是變量不共享。共享數據的情況就是多個線程可以訪問同一個變量,
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);
}
}
執行結果如下:
這樣就可以達到我們預期的效果