多執行緒-區域性變數和成員變數
阿新 • • 發佈:2019-01-25
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,所以會造成對成員變數的操作會造成另外一個執行緒的影響