Java 多線程(四) 多線程訪問成員變量與局部變量


Java 多線程(四) 多線程訪問成員變量與局部變量

  先看一個程序例子:

  

復制代碼
public class HelloThreadTest
{
    public static void main(String[] args)
    {
        HelloThread r = new HelloThread();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();

    }

}

class HelloThread implements Runnable
{
    int i;

    @Override
    public void run()
    {

        while (true)
        {
            System.out.println("Hello number: " + i++);

            try
            {
                Thread.sleep((long) Math.random() * 1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            if (50 == i)
            {
                break;
            }
        }

    }
}
復制代碼

  該例子中,HelloThread類實現了Runnable接口,其中run()方法的主要工作是輸出"Hello number: "字符串加數字i,並且同時遞增i,當i到達50時,退出循環。

  main()方法中生成了一個HelloThread類的對象r,並且利用這個一個對象生成了兩個線程。

  程序的執行結果是:順次打印了0到49的數字,共50個數字。

  這是因為,i是成員變量,則HelloThread的對象r只包含這一個i,兩個Thread對象因為由r構造,所以共享了同一個i

 

  當我們改變代碼如下時(原先的成員變量i被注釋掉,增加了方法中的局部變量i):

復制代碼
public class HelloThreadTest
{
    public static void main(String[] args)
    {
        HelloThread r = new HelloThread();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();

    }

}

class HelloThread implements Runnable
{
    // int i;
    // 若i是成員變量,則HelloThread的對象r只包含這一個i,兩個Thread對象因為由r構造,所以共享了同一個i
    // 打印結果是0到49的數字
    @Override
    public void run()
    {
        int i = 0;
        // 每一個線程都會擁有自己的一份局部變量的拷貝
        // 線程之間互不影響
        // 所以會打印100個數字,0到49每個數字都是兩遍
        while (true)
        {
            System.out.println("Hello number: " + i++);

            try
            {
                Thread.sleep((long) Math.random() * 1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            if (50 == i)
            {
                break;
            }
        }

    }
}
復制代碼

  如注釋中所述,由於局部變量對於每一個線程來說都有自己的拷貝,所以各個線程之間不再共享同一個變量,輸出結果為100個數字,實際上是兩組,每組都是0到49的50個數字,並且兩組數字之間隨意地穿插在一起。 

 

得到的結論如下:

  如果一個變量是成員變量,那么多個線程對同一個對象的成員變量進行操作時,它們對該成員變量是彼此影響的,也就是說一個線程對成員變量的改變會影響到另一個線程。

  如果一個變量是局部變量,那么每個線程都會有一個該局部變量的拷貝(即便是同一個對象中的方法的局部變量,也會對每一個線程有一個拷貝),一個線程對該局部變量的改變不會影響到其他線程。

 

 

參考資料

  聖思園張龍老師Java SE系列視頻教程。

 

來源:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913659.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM