Java 多執行緒訪問成員變數與區域性變數

2021-06-22 21:49:28 字數 1084 閱讀 6206

public class hellothreadtest

}class hellothread implements runnable

catch (interruptedexception e)

if (50 == i)}}

}

該例子中,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

}class hellothread implements runnable

catch (interruptedexception e)

if (50 == i)}}

}

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

得到的結論如下:

如果乙個變數是成員變數,那麼多個執行緒對同乙個物件的成員變數進行操作時,它們對該成員變數是彼此影響的,也就是說乙個執行緒對成員變數的改變會影響到另乙個執行緒。

如果乙個變數是區域性變數,那麼每個執行緒都會有乙個該區域性變數的拷貝(即便是同乙個物件中的方法的區域性變數,也會對每乙個執行緒有乙個拷貝),乙個執行緒對該區域性變數的改變不會影響到其他執行緒。

Java 多執行緒 成員變數與區域性變數

執行緒會共享程序範圍內的資源,例如記憶體控制代碼和檔案控制代碼,但每個執行緒都有各自的程式計數器 棧及區域性變數等。執行緒還提供了一種直觀的分解模式來充分利用多處理器系統中的硬體並行性,而在同乙個程式中的多個執行緒還可以被同時排程到多個cpu上執行。執行緒也被稱為輕量級程序。在大多數現代作業系統中,...

JAVA多執行緒成員方法

string getname 返回該執行緒的名稱。voidsetname string name 改變執行緒名稱,使之與引數name相同。也可以能夠通過thread的構造方法傳入string型別的名字 new thread 執行緒1 start static thread currentthread...

多執行緒 Java多執行緒與併發

實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...