Java でクラスの異なるインスタンスを実行しているスレッド間で静的変数を同期するにはどうすればよいでしょうか? 質問する

Java でクラスの異なるインスタンスを実行しているスレッド間で静的変数を同期するにはどうすればよいでしょうか? 質問する

メソッドの前にキーワードを使用すると、そのオブジェクトが同期されることはわかっています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

静的変数へのアクセスを同期する方法はいくつかあります。

  1. 同期された静的メソッドを使用します。これはクラス オブジェクトで同期します。

    public class Test {
        private static int count = 0;
    
        public static synchronized void incrementCount() {
            count++;
        }
    } 
    
  2. クラス オブジェクトを明示的に同期します。

    public class Test {
        private static int count = 0;
    
        public void incrementCount() {
            synchronized (Test.class) {
                count++;
            }
        }
    } 
    
  3. 他の静的オブジェクトと同期します。

    public class Test {
        private static int count = 0;
        private static final Object countLock = new Object();
    
        public void incrementCount() {
            synchronized (countLock) {
                count++;
            }
        }
    } 
    

ロック オブジェクトがクラス外部に公開されないため、多くの場合、方法 3 が最適です。

おすすめ記事