2012-02-20 17 views
2

私はJavaをかなり新しくしており、クリアする必要があるのか​​疑問があります。私はelaborateX()は "1" を返すことのチャンス(特にメソッドSETX(あれば)だけを設定Xだけではありませんが)あります理解したよう"if"はいつもメソッドを終了するのを待つか?

public int x; 

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

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

:このようなコードを使用して

私は、スレッドが "バグ"を防ぐのに使用できるという問題を見た後で知っていますが、私の質問です。以下は常に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; 
} 

この場合、elaborateX()は常に「6」を返しますか?

私は100%確実にする必要があるので、私はこのトリックの代わりに「適切なアプローチ」を使用します。

ありがとうございました

+1

シングルスレッドを想定すると、時限待機/中断またはjoiningによってのいずれかであるelaborateX ()は "1"を返します。 "間違っています。 –

+0

はい、そうです。上記のようなシングルスレッドアプリケーションでは、各命令が次の命令の前に完全に実行されるため、6が返されると期待できます。それは決定論的です。 – jbranchaud

答えて

1

複数のスレッドを使用しない限り、6以外の何かを返すことはありません。

これはスレッドに関するものであり、すべての操作が順番にスレッド化されているため、操作の並べ替えはありません。 (あなたが見ることができる少なくとも何で、VM​​自体が狂っ最適化のすべてのソートを行いますが、それは見えてはなりません。)

しかし、Javaは無関係なものの、発生する可能性がありますブール演算子||&&short-circuit evaluationを、使用しています準備ができていない場合も同様の問題。

2

はい。

通常のJavaコードは常に同期します。

2

2つの異なるスレッドが同時に変数を変更している場合、問題が発生する可能性があります。

例ではスレッドが1つしかないように見えるので、すべてが順番に実行されることを前提としています(つまり、setXメソッドはその後の指示よりも前に完全に終了します)。

0

いいえ、あなたはJavaとスレッドプログラミングで "同期"しています。すでに別の言語のスレッドプログラミングに精通していますか?

0

あなたのアプリケーションは、常に6を返すと期待できます(シングルスレッドプログラムを想定しています)。

if文は、プログラムが正しく分岐するためには、条件ブロック内のコードを実行する必要があります。私は完全に実行されていない条件付きの考え方がどこから来たのか分かりませんが、プログラムの決定的実行にどのように問題があるのか​​が分かります。私はif文が完全に実行/評価された状態でコードなしでどのように分岐するかについてもわかりません。

0

私はチャンスがある理解では(特に場合メソッドのSETX() だけで設定Xだけではありません)elaborateX()は「1」を返すこと。

あなたがそうあなたのelaborateX実行スレッドは、常にこのような場合には「6」を返す)1.

ウィルelaborateX(としてxを見つけていきますsetXに新しいスレッドを生成場合にのみ起こることができますか?ノーとyes.Thisがあなたのimplementation.IfあなたがsetXで新しいスレッドを生成、その後elaborateXスレッドの実行中に、あなたはメカニズムを実装する必要があります。1.

するxを継続していますに依存

setXが終了して結果を得るのを待つ。私はそれ(法SETXは()だけで設定Xだけではありません場合は特に)チャンスがある理解したよう

これは」スレッド

関連する問題