2013-04-29 47 views
1

我有兩種情況:Java:可以2個線程真正同時在一個對象上運行相同的非同步方法嗎?

情況1:有2個線程,它們共享具有doSomething()方法的類的一個實例。 情況2:有2個線程,每個線程都有一個具有doSomething()方法的類的實例。

void doSomething() { 
    for (int i = 0; i < 20; i++) { 
      System.out.println(Thread.currentThread().getName()); 
     } 

當2個線程啓動時,它們都調用doSomething()。看看輸出,我看不出情況1和2

爲2個線程(線程A和B)的輸出是這樣的區別:AAAABBBAABBBB ....

你能告訴我情況1和2之間的併發差異?非常感謝!

+0

無論如何,該方法應該是靜態的。 – SLaks 2013-04-29 15:18:07

回答

1

您將無法看出區別像上述的情況,因爲操作不影響任何狀態變量(實例變量)。嘗試的方法是這樣的:

class C { 
int i = 0; 
synchronized void doSomething() { 
    while(i < 20) { 
    System.out.println(Thread.currentThread().getName() + " : Value for i=" + i); 
    i++; 
    } 
} 
} 

如果運行上述使用2個獨立的物體,所述線程中的每一個將打印20個值(從0到19)。 如果你運行上面用2個線程共享相同的對象,總體的2個線程將打印20個值,但它是不確定哪個線程將打印什麼值,因爲你無法預知哪個線程將獲得遞增i值。

+0

謝謝你的回答,我用2個線程和1個對象測試你的代碼。但是,只有一個線程會打印0到19之間的值。另一個線程不會執行任何操作,因爲在那個時候,我是20.我必須在while循環之外再添加一行:i = 0;將i的值重置爲0,然後我明白你的意思。無論如何,你的代碼給了我想知道的事情的想法。謝謝! – 2013-04-30 04:49:05

0

沒有區別。

除​​關鍵字,線程不關心實例。

0

正如你可能懷疑的,沒有從一個併發分之差。

1

有隻有當線程觸及他們正在運行的對象的成員數據的兩種情況之間的差異。

使用兩個線程和兩個對象,您會看到它們都獨立運行。

隨着兩個線程,一個對象,你會看到他們互相干擾,在成員變量覆蓋彼此的價值觀。這被稱爲競賽條件,因爲它是間歇性的,所以它是一種巨大的尋找和調試的痛苦。處理共享變量的兩個線程是信號量和鎖定語句存在的原因。

相關問題