シンクロナイズドの実現原理は何ですか?
Synchronizedの実現原理は、Javaのmonitor機構に基づいています。Javaの各オブジェクトにはモニタ(monitor)が関連付けられており、モニタはオブジェクトの排他アクセスを実現するための同期プリミティブです。
synchronized修飾されたメソッドやコードブロックにアクセスするスレッドは、対応するオブジェクトのモニターを取得しようとします。モニターが別のスレッドに占有されている場合、現在のスレッドはブロックされ、モニターが解放されるのを待ちます。モニターが解放されると、現在のスレッドは再びモニターを取得し、処理を続行します。
Javaでは、synchronizedはメソッド、コードブロック、静的メソッドなどに修飾することができます。非静的メソッドの場合、synchronizedはオブジェクトインスタンスのモニターを取得します。静的メソッドの場合、synchronizedはクラスのモニターを取得します。つまり、同じオブジェクトインスタンスでは、synchronizedで修飾されたメソッドを実行するスレッドは常に1つに制限されます。同じクラスの異なるインスタンスでは、synchronizedで修飾された静的メソッドを実行するスレッドも常に1つに制限されます。
synchronized修饰されたメソッドやコードブロックは、入るときに自動的にmonitorを取得し、出るときに自動的にmonitorを開放します。この自動的な取得と開放のメカニズムは、共有リソースへのアクセスが直列化され、複数スレッドによる競合や不一致の問題を防ぐことを保証します。