9

ReentrantLock クラスの実装を調べているときに、1 つの疑問が頭に浮かびました。ReentrantLock はシリアル化可能であり、ドキュメントでは、シリアル化されたときの状態に関係なく、シリアル化解除されたロックは常にロック解除されると記載されています。ロックとロック解除の状態は基本的に実行時の (ロックを保持している) スレッドに基づいており、これらのスレッドをデシリアライズしている間は利用できない可能性があるため、これは理にかなっています。

質問: ロックは基本状態 (ロック/ロック解除) を保存しないため、ロックを保持する必要があるのはなぜですか? 今のところ、それはロックの公平性のためであると推測できます。ただし、公平性は基盤となる OS に依存するため、あるプラットフォームでロックを保持し、別のプラットフォームでデシリアライズすると、(一度書き込みを行えばどこでも実行できる) 機能しない可能性があるため、公平性のためだけに保持しても意味がありません。

Java での Lock シリアライゼーションに関する私の混乱を明確に説明してください。

4

1 に答える 1

6

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html http://download.java.net/jdk7/archive/b123/docs/api/java /util/concurrent/locks/ReentrantLock.html

Lock が持続する理由は、Lock 自体に依存するオブジェクトをシリアライズできるようにするためだと思います。Lock がシリアライズ可能でない場合、それに依存するものもシリアライズできません。

また、所有者、holdCount、queuedThreads、および上でリンクした ReentrantLock の API ページで確認できるその他すべてのものを保存することもできます。

于 2013-07-31T19:20:00.597 に答える