Javaにおけるsynchronizedの使用方法
Javaでは、synchronizedキーワードがスレッド間の同期に使用され、複数のスレッドが共有リソースにアクセスする際的安全性が確保されます。
synchronizedの使い方には以下のようなものがあります。
- メソッドを同期化する方法として、メソッド宣言にsynchronizedキーワードを使用することがあります。こうするとメソッド全体が同期化メソッドとして定義されます。同期化メソッドは、あるスレッドがメソッド内に入ると同時に、そのメソッドの属するオブジェクトのロックを自動取得します。他のスレッドはロックが解放されるまでメソッドにアクセスできません。
public synchronized void synchronizedMethod(){
// 同步方法的代码块
}
- synchronizedキーワードをコードブロックに付加すると、ロック対象のオブジェクトを指定できます。このコードブロックに入ったスレッドは指定したオブジェクトのロックを取得しようとします。他のスレッドはロックが解放されるまで同期コードブロックに入ることができません。
synchronized (锁对象){
// 同步代码块的代码
}
- staticメソッドを修飾する: staticメソッドにsynchronizedキーワードを付与して、staticリソースへの同時アクセスを実現する。そのメソッドが属するクラスのClassオブジェクトがロックとして機能します。
public static synchronized void synchronizedStaticMethod(){
// 静态同步方法的代码块
}
備考
- synchronizedキーワードを使用する際は、任意のオブジェクトをロックオブジェクトとして指定する必要があります。同一ロックオブジェクトに対しては、同時に1つのスレッドのみがロックを取得でき、その他のスレッドはロックが解除されるのを待ちます。
- synchronizedキーワードはスレッドの直列実行を引き起こし、並列性能を低下させるので、慎重に使用する必要があります。
- synchronized キーワードは、同期メソッド、同期コードブロック、静的同期メソッドでのみ使用でき、変数やコンストラクターメソッドでは使用できません。
- Java5以降には、ReentrantLockやConditionなど、スレッドの同期をより細かく制御できる、より柔軟なロック機構も提供されている。