1. 程式人生 > >多執行緒-區域性變數和成員變數

多執行緒-區域性變數和成員變數

Java多執行緒對成員變數和區域性變數的影響

最近複習了一下Java多執行緒的一些基礎的礎知識,這裡演示一個java多執行緒對成員變數和區域性變數的Demo

對區域性變數的操作:

/**
 * Java區域性變數和成員變數程式碼演示
 */
public class TTTTTT {
    public static void main(String[] args)
    {
        DemoThread  r = new DemoThread ();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
        //可以看到控制列印了20次
} } class DemoThread implements Runnable { int i;//這裡成員變數, @Override public void run() { while (true) { System.out.println("測試列印次數: " + i++); try { Thread.sleep((long) Math.random() * 10000); } catch (InterruptedException e) { e.printStackTrace(); } if
(20 == i) { break; } } } }

列印結果:

測試列印次數: 0
測試列印次數: 2
測試列印次數: 1
測試列印次數: 3
測試列印次數: 4
測試列印次數: 5
測試列印次數: 6
測試列印次數: 7
測試列印次數: 8
測試列印次數: 9
測試列印次數: 10
測試列印次數: 11
測試列印次數: 12
測試列印次數: 13
測試列印次數: 14
測試列印次數: 15
測試列印次數: 16
測試列印次數: 17
測試列印次數: 18
測試列印次數: 19

1.上面例子中:DemoThread實現了Runable介面類實現了Runnable介面,其中run()方法的主要工作是輸出”測試列印次數”字串加數字i,並且同時遞增i,當i到達20時,退出迴圈。
2.main()方法中生成了一個DemoThread類的物件r,並且利用這個一個物件生成了兩個執行緒。
3.因為i是我們的區域性變數,而且兩個Thread物件都是有r構造,共享了一個i。所以一共列印了20次數

對區域性變數的操作:

對上面的例子進行修改,程式碼如下:

/**
 * Java區域性變數和成員變數程式碼演示
 */
public class TTTTTT {
    public static void main(String[] args)
    {
        DemoThread  r = new DemoThread ();
        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);
        t1.start();
        t2.start();
        //可以看到控制列印了20次
    }
}
class DemoThread  implements Runnable {
   // int i;//這裡成員變數,兩個Thread共享了一個r,所以這裡共享了一個i,列印次數一共20次數
    @Override
    public void run() {
        int i=0;//這裡的i為區域性變數,每個執行緒自己都有一個i,所以這裡不會共享,列印的次數為40次
        while (true) {
            System.out.println("測試列印次數: " + i++);
            try {
                Thread.sleep((long) Math.random() * 10000);
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (20 == i) {
                break;
            }
        }
    }
}

列印結果:

測試列印次數: 0
測試列印次數: 1
測試列印次數: 2
測試列印次數: 3
測試列印次數: 4
測試列印次數: 5
測試列印次數: 6
測試列印次數: 7
測試列印次數: 8
測試列印次數: 9
測試列印次數: 10
測試列印次數: 11
測試列印次數: 12
測試列印次數: 13
測試列印次數: 0
測試列印次數: 1
測試列印次數: 2
測試列印次數: 3
測試列印次數: 4
測試列印次數: 5
測試列印次數: 6
測試列印次數: 7
測試列印次數: 8
測試列印次數: 9
測試列印次數: 10
測試列印次數: 11
測試列印次數: 12
測試列印次數: 13
測試列印次數: 14
測試列印次數: 15
測試列印次數: 16
測試列印次數: 17
測試列印次數: 18
測試列印次數: 19
測試列印次數: 14
測試列印次數: 15
測試列印次數: 16
測試列印次數: 17
測試列印次數: 18
測試列印次數: 19

可以看到列印的結果為40次數。

結論:

如果一個變數是成員變數,那麼多個執行緒對同一個物件的成員變數進行操作時,它們對該成員變數是彼此影響的,也就是說一個執行緒對成員變數的改變會影響到另一個執行緒。
如果一個變數是區域性變數,那麼每個執行緒都會有一個該區域性變數的拷貝(即便是同一個物件中的方法的區域性變數,也會對每一個執行緒有一個拷貝),一個執行緒對該區域性變數的改變不會影響到其他執行緒。

注意

一定是多個執行緒對同一個物件的成員變數進行操作。也就是多個執行緒共享了一個物件。這個是前提條件。上面例子中t1和t2共享了同一個r,所以會造成對成員變數的操作會造成另外一個執行緒的影響