Javaのsynchronizedについての質問です。あるスレッドがロックを取るとき、メモリ上ではどのようなことが起こっているのでしょうか。mutexベースのロックとの情報もありますが、モニタと呼ばれる、より高度な方法で排他制御していると聞きました。これって、どのようなものなのでしょうか?
イメージ的には、
こちらの記事
がわかりやすかったです。
単にmutexベースのロックならば、あるオブジェクトAを対象とするsynchronizedブロックを考えると、複数のスレッドがクリティカルセクションを実行しようとしたときに、あるスレッドはmutexを見に行き、値が存在するならば、そのスレッドはブロックされ、値が存在していないなら、自分のメモリのアドレスなどを書き込んだ後に、実行し、実行後その値を消すというの処理をすれば、排他制御は実現できます。
私はこれをmutexベースのロックと呼んでいます。
ただ、Javaの場合ですと、mutexではなく、monitorと呼ばれる仕組みで排他制御を行なっているらしいです。これは一体どのようなものなのでしょうか。また、Objectクラスにあるwait()メソッドは、それを実行したスレッドをwait setと呼ばれる領域に配置する、とのことですが、これはリソースを取得しようとしてブロックされた状態とは明確に区別されます。
上で紹介した記事では、分かりやすさのために、インスタンスがモニターやウェイトセットを持つとしていますが、実際のところ、システムはどのようにして、これらを実現しているのでしょうか。
Javaに詳しい方、是非とも教えてください。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/07/23 03:40 編集
2017/07/23 13:44 編集