2011-08-11 18 views
1

1つのスレッドコールプラス1、2番目のプラス2。フィールドの最初の変更になりますか?または、2回目の呼び出しlock()を呼び出すスレッドでは使用できませんか?ReentrantLockをロックします。 javadocを理解できません

plus2がlock()を呼び出さない場合、彼はどのような値を使用しますか?

public class Test { 

private final ReentrantLock lock = new ReentrantLock(); 
private int first; 

public void plus1() { 
    lock.lock(); 
    try { 
     first++; 
    } finally { 
     lock.unlock(); 
    } 
} 

public void plus2() { 
    lock.lock(); 
    try { 
     first += 2; 
    } finally { 
     lock.unlock(); 
    } 
} 

public int getFirst() { 
    return first; 
} 

}

+4

あなたの質問は(少なくとも私にとって)理解するのは難しいです。 'plus1'と' plus2'の両方が 'first'フィールドを変更するので、フィールドは2回修正されるように見えますが、同時ではありません...あなたが何を求めているのかは分かりません。 –

+0

この場合、ロックは再入可能である必要はありません。ロックを使用する別のメソッドからロックを使用するメソッドを呼び出さないでください。したがって、1つのスレッドは決してコールスタック内でロックを2回入力することはできません。 –

+0

また、getFirst()でロックを使用する必要があります。そうしないと、他のメソッドによる変更がgetFirst()を呼び出すスレッドに表示されない場合があります。 –

答えて

0

はい、両方のスレッドがfirstを変更します。ロックのポイントは、ロックがなければ、アップデートの1つが失われる可能性があるということです。

ロックの再入可能性は、スレッドAにロックがある場合、ロックを再ロックできることを意味します。ロック/アンロックはネストされています。

plus2がロックを使用しなかった場合、増分またはそれより前の値を取得する可能性があります。通知する方法はありません。

+0

返信ありがとうございます)今度はもっと自信があります) AtomicInteger、彼の値はいくつかのスレッドがunlock()を呼び出している間に更新されませんか? – Ivan

1

ワンスレッドコールプラス1、セカンドプラス2。フィールドの最初の変更になりますか?または 2回目の呼び出しlock()を呼び出すスレッドでは使用できませんか?

ロックを最初に取得するスレッドによって異なります。最初のスレッドがロックを取得した場合、2番目のスレッドは最初のスレッドがロックを解除するまで待機する必要があります。

plus2がlock()を呼び出さない場合、彼はどのような値を使用しますか?

これは予測できません。あなたは分からない。そのため、確定的な結果を出すためにはロックが必要です。

4

plus2()を呼び出している第二のスレッドは、最初のスレッドの後に実行を開始された場合(すなわち、最初のスレッドが現在plus1()を実行する)ロックが解放されるまで待たなければならないです(lock.lock()方法はブロックになります)。 plus2()がロックを使用しないであろう

場合、それは、(ポストインクリメントと暗黙的である)割り当てが発生したか否かに応じて、(0になり)firstの初期値またはfirst + 1で動作するかもしれません。したがって、firstのどの値が使用されるのかを明確に知ることはできません。

関連する問題