2010-07-08 80 views
1

我只是在玩Java中的線程。我有一個實現可運行的類。關於線程的問題

public class MyThread implements Runnable{ 

    private boolean finished; 
    //Other variables 

    public void run(){ 
     //Thread code 
    } 
} 

我的理解是,類型MyThread的每個線程都有自己的成員變量的副本,並寫入這些成員變量,無需同步。這個假設是否正確?如果正確,訪問什麼需要同步?有人可以關心給大綱或僞代碼。?謝謝。

回答

6

不一定。您可以使用相同的MyThread實例創建多個線程。例如:

MyThread x = new MyThread(); 
new Thread(x).start(); 
new Thread(x).start(); 
new Thread(x).start(); 

現在將有三個線程在同一個對象中運行代碼。

我建議你重命名MyThread,因爲它的不是一個線程 - 這是線程執行的任務。這使得它更清晰(IMO)。

+0

在這種情況下,所有三個線程(運行x)都看到*相同的*完成字段,所以如果在一個線程中更改了'finished',那麼其他兩個線程是否會看到更改?或者,這是'volatile'關鍵字會改變行爲的例子嗎? – 2010-07-08 07:43:20

+0

@Andreas_D:他們都將使用相同的字段,但沒有易變的修飾符,他們可能看不到對方的變化。 – 2010-07-08 07:49:00

+0

接受。但這是否意味着如果線程在不同的實例上運行,什麼都不需要同步?或者在相同類型的不同實例上運行的線程之間共享什麼? – user378101 2010-07-08 07:52:25

0
  • 每個MyThread實例都是一個新的實例,就像普通的類和對象一樣。
  • 複製本機類型的變量。這意味着在一個線程中更改變量對另一個線程不起作用。這些不必同步。
  • 對於其對象引用被複制。這意味着兩個線程可能有一個對同一個對象的引用。如果兩個線程同時操縱該對象,則可能會變差。因此,這些訪問必須同步。
0

concurrency上真正的大指數線索非常值得一讀(是的,它有例子)。