Javaオブジェクトロックとクラスロックの違いは何ですか?
Javaのオブジェクトロックとクラスロックは2つの異なるロッキングメカニズムで、それぞれ役割と使用法が異なります。
- Javaオブジェクトロック: インスタンスロックとも呼ばれ、オブジェクトインスタンスに対するロックです。各オブジェクトインスタンスには、そのオブジェクトインスタンスに対する同時アクセスを制御するための、対応するオブジェクトロックがあります。スレッドがオブジェクトのロックを取得すると、他のスレッドはロックを解除するまで、そのロックの取得を待機する必要があります。オブジェクトロックの使用方法は2通りあります。
- synchronizedキーワード:メソッドとコードブロックに利用できる。synchronizedメソッドは、現在のオブジェクトインスタンスに対してロック、synchronizedコードブロックは指定したオブジェクトに対してロックできる。
- Lockインターフェース:Lockオブジェクトのlock()とunlock()メソッドでロックを明示的に制御できます。
- クラスロック:スタティックロックとも呼ばれ、クラス専用のロックのこと。クラスロックは、クラスのスタティックメンバへの同時アクセスを制御するために使用します。あるスレッドがクラスのロックを取得すると、他のスレッドはこのロックが解放されるのを待ってから取得する必要があります。クラスロックを使用する方法には次の 2 つがあります。
- synchronizedキーワード:静的メソッドとコードブロックに使用でき、静的メソッドを同期する場合、ロックされるのは現在クラス。静的コードブロックの場合は、ロックするクラスを指定できる。
- Lockインターフェース:Lockオブジェクトのlock()メソッドとunlock()メソッドによりロックを明示的に制御
違い:
- ロックの対象が異なります。オブジェクトロックはオブジェクトインスタンスに対して行われ、同じオブジェクトインスタンスへの同時アクセス時にロックされます。一方クラスロックはクラスに対して行われ、同じクラスの静的メンバへの同時アクセス時にロックされます。
- ロック対象が異なる。オブジェクトロックはオブジェクトインスタンスをロックし、別なオブジェクトインスタンスと干渉しない。クラスロックはクラス自体をロックし、すべてのオブジェクトインスタンスが同じロックを共有する。
- ロックする粒度が違います。オブジェクトロックはよりきめ細かいロックを実現でき、異なるオブジェクトインスタンス間で同時アクセスが可能です。クラスロックはグローバルなロックであり、すべてのオブジェクトインスタンスが同一のロックの解放を待つ必要があります。
オブジェクトロックとクラスロックはそれぞれ、オブジェクトインスタンスとクラスの排他制御に使用され、実際のニーズに応じて適切なロックメカニズムを選択します。