3

ReentrantReadWriteLockドキュメントでは次のように述べられています。

writer can acquire the read lock, but not vice-versa

私が正しく理解していれば、同じスレッドから実行できることを意味します:

//thread1
lock.writeLock().lock()
lock.readLock().lock()
print("this line executes")

これは理にかなっています。すでにロックされている場合write、他のスレッドはロックされたコードに入ることができません。しかし、 をロックした場合、他のスレッドがロックを作成していない場合、同じスレッドでブロックにread入ることができないのはなぜですか? したがって、これは機能しません:writeread

//thread1
lock.readLock().lock()
lock.writeLock().lock()
print("this line doesn't execute")

同じスレッドでロックするread前にロックを解除する必要があるのはなぜですか?write

4

2 に答える 2

0

私は実際に答えを知りませんが、デッドロックする可能性のあるコードを書くのを避けるのに役立つかもしれません.

同じコードを実行する 2 つのスレッドがあるとします。両方のスレッドが読み取りロックを取得しました。次に、両方のスレッドが書き込みロックを取得しようとします。他のスレッドが読み取りロックを解放するまで、どちらのスレッドも続行できませんが、アップグレードを待機している間は、どちらのスレッドも読み取りロックを解放しません。

別の実装では、デッドロックを検出し、それが検出されたときに両方のスレッドで例外をスローすることができますが、(A) デッドロックの検出を必要としないアプリケーションのパフォーマンスに悪影響を与えるか、(B) API も複雑になると誰かが考えた可能性があります。多くの。

読み取りロックを書き込みロックにアップグレードすることを禁止することで、特定の方法でデッドロックするプログラムを作成することを不可能にしました。

于 2017-03-29T16:52:39.770 に答える