我知道在方法使对象同步之前使用synchronize关键字。也就是说,运行对象的同一实例的2个线程将被同步。

但是,由于同步是在对象级别进行的,因此运行对象的不同实例的2个线程将不会同步。如果我们在Java类中有一个由该方法调用的静态变量,则希望在该类的各个实例之间进行同步。这两个实例在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,所以现在静态变量countTest类的实例之间同步了吗?

最佳答案

有几种同步对静态变量的访问的方法。

  • 使用同步静态方法。这将在类对象上同步。
    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是最好的,因为锁对象没有暴露在类之外。

    07-24 18:23
    查看更多