2011-10-29 5 views
1

javadocを正しく解釈しているかどうかはわかりません。 lockメソッドを呼び出して正常にロックを取得した後にReentrantLockを使用すると、同期ブロックのないオブジェクトにアクセスでき、happend-before関係が魔法の勢いで実行されますか?Javaロックとhappend-beforeの関係

私はReentrantLockと私が作業しているオブジェクトとの間に接続がないので、私が安全に作業できるとは考えにくいです。しかし、これが当てはまるか、javadocを間違って読んでいますか?

答えて

4

スレッドAは、ロックによって保護コードブロックCB1の内部にいくつかのオブジェクトを変更して、ロックを解除し、スレッドBが、同じロックによって保護コードブロックに入り、その後、スレッドBが表示されている場合コードブロックCB1のスレッドAによって行われた変更。

2つのスレッドが同じ共有状態を読み書きする場合、この状態へのすべての読み書きは同じロックによって保護される必要があります。

2

それはだ...(ミューテックス)ロック:

void myMethod() 
{ 

    myLock.lock(); // block until condition holds 
    try 
    { 
     // Do stuff that only one thread at a time should do 
    } 
    finally 
    { 
     myLock.unlock() 
    } 
} 

1つのスレッドだけが一度にロックを保持することができ、とてもlock()unlock()呼び出しの間何もだけに1つのスレッドで実行されることが保証されて時間。

The relevant Oracle tutorial can be found here.

+0

ええ、私は彼らが排他的に実行されていることを理解しますが、私の質問は同じ状態が別のスレッドから見える場合を目指していました。 –

+1

あなたが話しているのは、どのスレッドがどのスレッドでどのように変数をキャッシュするかです。ロックの使用(または 'synchronized'キーワードの使用)は、同期を保証します。 [これは質問です](http://stackoverflow.com/questions/5022100/when-does-java-thread-cache-refresh-happens)私はより完全にあなたの質問に答えると思います。特にJLSの17.1項 –

2

魔法はありません。オブジェクトにアクセスするすべてのスレッドがReentrantLockまたはブロック​​などの他のミューテックスである場合、オブジェクトが同じロックを使用する場合に限り安全です。

存在ReentrantLockが、それは​​より多くの柔軟性を提供することによって正当化される:あなたは、例えば、ちょうどはロックを取得するを試すことができます - ことができません​​で。

関連する問題