2011-12-05 9 views
0

私はJava同期メカニズムに疑念があります。私たちは、上記の方法のMET1でcode--ローカル変数のみを変更するスレッドを同期させる必要がありますか?

class A { 
    int instance=0; 
    synchronized void met1() { 
     instance=instance +1; 
     .... 
     instance = instance+2*3; 

     } 

の以下の部分を見てみましょう、我々は、オブジェクトのインスタンス変数を変更しているので、それはマルチスレッド環境には、同期させる必要があります。しかし、コードのこの部分で -

class A { 

    synchronized void met1() { 
     local=local +1; 
     .... 
     local = local+2*3; 

     } 

方法MET1は、私はその方法を実行するスレッドごとに一意になると思うローカル変数を変更しています。したがって、この場合、スレッドがローカル変数のみを変更している場合、メソッドを同期させる必要がありますか?

答えて

0

2番目の例では、met1の中で宣言していないため、localはローカルではありません。おそらく、あなたは意味:各メソッド呼び出しは、呼び出し元のスレッドのスタック上で発生するので

synchronized void met1() { 
    int local = 0; 
    // ... 
    local=local +1; 
    .... 
    local = local+2*3; 

    } 

はその後はい、あなたは正しい、メソッドのローカル変数は、対応するスレッドのスタックを存在し、同期アクセスする必要はありません。

+0

Thanx..Iは実際にこれを意味しました.... – user496934

3

変数がmet1の内部で宣言されていると仮定すると、​​は不要です。

0

変数が本当にメソッドローカルではない場合 - しかし、あなたのサンプルコードは実際にローカル宣言を表示しません!この例を周囲に広げないでください。

0

いいえ、メソッドがローカルスコープ内でのみ変数を定義して使用する場合は、同期する必要はありません。 変更可能な状態へのアクセスを変更または提供するメソッドを同期する必要があります。

Javaの並行性のルールは、思っているよりも複雑であり、複雑さがたくさんあるので、複雑なものを読み解く価値があります。 Goetzらの "Java Concurrency in Practice"はかなり良い(そして基本的には馬の口から出る)。

0

いいえ。メソッドがローカル変数とメソッド引数のみを変更する場合は、メソッドを同期させる必要はありません。ステートレスで不変なクラスがあればあるほど、必要な同期が少なくなります。

0

いや、あるには、ローカル変数のみを変更し、あなたがマルチスレッド環境でのローカル変数を心配する必要はありませんオブジェクト

0

の状態を変更しない方法を同期する必要はありません。同期させる必要はありません。しかしあなたのコードでは、変数 "local"はmet1()のローカル変数として定義されていません。

関連する問題