2012-02-20 41 views
2

我對Java相當陌生,並且有疑問需要清除。「如果」總是等方法完成?

使用這樣的代碼:

public int x; 

public int elaborateX(){ 
    x = 0; 
    setX(); 
    x+=1; 
    return x; 
} 

public void setX(){ 
    //... 
    //some workload here 
    //... 
    x = 5; 
} 

據我瞭解有機會(尤其是如果該方法setX的()所做的不僅僅是集合X更多)elaborateX()將返回 「1」。

我在看後面的問題後知道線程可以用來防止「bug」,但我的問題是;下面總是會等待setX()完成執行嗎?

public int x; 

public int elaborateX(){ 
    x = 0; 
    if(setX()){ 
     x+=1; 
    }; 

    return x; 
} 

public boolean setX(){ 
    //... 
    //some workload here 
    //... 
    x = 5; 
    return true; 
} 

Will elaborateX()在這種情況下總是返回「6」嗎?

我在問,因爲我需要100%確定,否則我會用「正確的方法」來代替這個「竅門」。

感謝

+1

假設單個線程,「由於我知道有機會(尤其是如果該方法setX的()並不僅僅是集合X更多)elaborateX ()將返回「1」。「是不正確的。 – 2012-02-20 17:02:10

+0

是的,它會的。在像上面那樣的單線程應用程序中,可能會返回6,因爲每個指令在下一個指令之前都會完全執行。這是確定性的。 – jbranchaud 2012-02-20 17:02:59

回答

1

除非使用多個線程,否則不會返回除6以外的任何內容。

這就是線程的內容,每個操作都是一個接一個地線程化,沒有操作的重新排序。 (至少沒有什麼,你可以看到,虛擬機本身會做各種瘋狂的優化的,但一定是不可見的。)

但是,Java使用布爾運算符||&&,這雖然無關,可引起short-circuit evaluation類似的問題,如果你沒有準備。

2

是。

普通的Java代碼總是同步的。

2

如果兩個不同的線程同時更改變量,則可能會遇到問題。但是,由於您的示例只顯示一個線程,因此您可以安全地假定所有事情都會按順序發生(即setX方法將始終在任何後續指令之前完成)。

0

不,你已經看到Java和線程編程中的「同步」。你是否已經熟悉另一種語言的線程編程?

0

你可以期待你的應用總是返回6(假設一個單線程程序)。

if語句必須在其條件塊內執行代碼才能正確分支程序。我不確定有條件的不完全執行的想法是從哪裏來的,但我認爲你可以看到如何確定性地執行程序會有什麼問題。我甚至不知道if語句如何在沒有代碼完成執行/評估的條件下進行分支。

0

據我瞭解有機會(尤其是如果該方法setX的() 並不僅僅是集合X更多)elaborateX()將返回「1」。

,如果你在setX生成一個新的線程,這樣你elaborateX執行線程將繼續尋找x爲1

威爾elaborateX()總是在這種情況下返回「6」這隻能發生?

否,是。這裏取決於你implementation.If你產卵的setX一個新的線程,然後在elaborateX線程執行,你會繼續尋找x爲1

您必須實現機制等待setX完成並獲得結果。

這可能是或者通過定時的等待/中斷或由joining線程