Java のsynchronized
キーワードを任意のオブジェクトに適用して、先に進む前にそのオブジェクトの「ロックを取得」(またはそのオブジェクトの「同期」) できます。他のプロセスが同時に同じオブジェクトで同期するコードを実行しようとすると、オブジェクトをロックしたプロセスが同期ブロックを終了するまでブロックされます。
synchronized
同期するオブジェクトは、ブロックのどの部分でも実際に使用する必要はありません。同期ブロックでロックおよびロック解除することのみを目的とする単純なミューテックス オブジェクトである可能性があります。ただし、オブジェクトを単に同期しても、他のスレッドがそのオブジェクトでも同期しない場合、他のスレッドがそのオブジェクトを変更するのを防ぐことはできないことに注意することが重要です。これは、組み込みのロックではなく、プログラマー/慣例によって強制されたロックであり、共有オブジェクトを使用するすべてのコードは、同期するために「同意」する必要があります。
たとえば、上で記述したコードでは、xyz()
メソッドが で同期するcars
場合でも、次のような別のメソッドを記述できます。
public void changeCar() {
Car myCar = cars.get("abc");
myCar.setColor("Blue");
}
を呼び出さcars
ずに変更しsynchronized
ます。このメソッドは、 onxyz()
を呼び出すコードを含まないため、メソッドが車を変更すると同時に「abc」車を変更する (つまり、スレッド セーフに違反する) 可能性があります。synchronized
cars
cars
マップがスレッド セーフであること (つまり、2 つのメソッドによって同時に変更されないこと)を保証したい場合は、次のいずれかを行う必要があります。
cars
最初の呼び出しを変更するコードがsynchronized(cars)
- その上での put 操作と get 操作がスレッドセーフであることを保証するConcurrentHashMapを使用します。