メソッドの前にキーワードを使用すると、そのオブジェクトが同期されることはわかっていますsynchronize
。つまり、オブジェクトの同じインスタンスを実行する 2 つのスレッドが同期されます。
ただし、同期はオブジェクト レベルで行われるため、オブジェクトの異なるインスタンスを実行する 2 つのスレッドは同期されません。メソッドによって呼び出される Java クラスに静的変数がある場合、クラスのインスタンス間で同期する必要があります。2 つのインスタンスは 2 つの異なるスレッドで実行されています。
以下の方法で同期を実現できますか?
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(lock)
{
count++;
}
}
}
lock
静的なオブジェクトを定義し、synchronized
そのロックにキーワードを使用しているため、静的変数がcount
クラスのインスタンス間で同期されるようになったというのは本当ですかTest
?
ベストアンサー1
静的変数へのアクセスを同期する方法はいくつかあります。
同期された静的メソッドを使用します。これはクラス オブジェクトで同期します。
public class Test { private static int count = 0; public static synchronized void incrementCount() { count++; } }
クラス オブジェクトを明示的に同期します。
public class Test { private static int count = 0; public void incrementCount() { synchronized (Test.class) { count++; } } }
他の静的オブジェクトと同期します。
public class Test { private static int count = 0; private static final Object countLock = new Object(); public void incrementCount() { synchronized (countLock) { count++; } } }
ロック オブジェクトがクラス外部に公開されないため、多くの場合、方法 3 が最適です。