2

たとえば、ファイルから読み取るときにreadLockを使用し、ファイルに書き込むときにwriteLockを使用することが適切であることは明らかです。ただし、次のような2つの値が比較されている操作がある場合:

if (i == j) {
    System.out.println("equal);
}

次に、writeLockの代わりにreadLock()を使用してこのコードをロックしても大丈夫ですか?確かに、私は何も書いていませんが、2つの値を比較しています。これは、操作が含まれるため、データを読み取るだけとは少し異なります。「i」または「j」はいつでも変更される可能性があることに注意してください。理論的には、readLock()は、writeLock()がリソースを変更していない場合にのみ前進しますが、この問題のすべての複雑さを完全には理解していない可能性があります。少し灰色の領域の可能性があるように思われるので、私はいくつかの入力を得るだろうと思いました。

みんなありがとう、

マット

4

2 に答える 2

4

読み取り/書き込みロックについては、読み取りと書き込みの観点から考えるのではなく、排他的/共有と考えてください。書き込みロックは排他的であり、読み取りロックは共有されます。

あなたの質問に答えるために、それは異なります。

iを更新している1つのスレッド、jを更新している1つのスレッド、および同等性をチェックしている別のスレッドがあるとします。その場合、書き込みスレッドは共有(読み取り)ロックを取得します。これは、各スレッドが1つの変数のみを更新するため、両方が並行して動作できるためです。次に、比較スレッドは、アクションの比較と実行のために排他ロック(書き込みロック)を取得して、アクションの実行中の更新を防ぐことができます。

したがって、排他的/共有の観点から、そしてアプリケーションのニーズは何かを考えてください。

于 2011-03-16T05:27:59.593 に答える
0

ij揮発性にし、変更アクセスを同期するだけで十分だと思いますが。

ただし、読み取り/書き込みロックを使用する必要があるとしましょう。その場合、上記のコードでは、読み取りロックが必要です。その理由は、指定されたコードが変更されていないコードであり、iまたはjを変更しないためです。したがって、他のメソッドは、破損することなくiとjの値を並列に読み取ることができます。書き込みロックは、iとjの値を変更する場所でのみ使用します。

編集:コメントに答えるために「それへの変更アクセスの同期」を強調表示

于 2011-03-16T05:16:06.010 に答える