如何在Java中运行不同类实例的线程之间同步静态variables?

我知道在一个方法为该对象带来同步之前使用synchronize关键字。
也就是说,运行同一个对象实例的2个线程将被同步。
但是,由于同步处于对象级别,因此运行不同对象实例的2个线程将不会同步。 所以,如果我们在方法调用的java类中有一个静态variables,我们希望它在类的实例间同步。
这两个实例在两个不同的线程中运行。
我们可以通过以下方式实现同​​步吗?

公共类testing  
 {  
    private static int count = 0;  
    private static final Object lock = new Object();    
    public synchronized void foo() 
   {  
      同步(locking)
      {  
         计数++;  
      }  
   }  
 }

是否真的,因为我们已经定义了一个静态的对象“锁”,并且我们正在使用该锁的关键字synchronized,所以静态varibale计数现在可以在类Test的实例间同步了?

有几种方法来同步对静态variables的访问。

  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在许多情况下是最好的,因为locking对象不会暴露在类之外。

如果您只是共享计数器,请考虑使用AtomicInteger或java.util.concurrent.atomic包中的其他合适的类:

 public class Test { private final static AtomicInteger count = new AtomicInteger(0); public void foo() { count.incrementAndGet(); } } 

是的,它是真实的。

如果你创build了两个类的实例

 Test t1 = new Test(); Test t2 = new Test(); 

然后t1.foo和t2.foo在同一个静态对象上同步,因此互相阻塞。

你可以通过类同步你的代码。 这将是最简单的。

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

希望你find这个有用的答案。

如果只是关于这个整数,你也可以使用

Interlocked.Increment(count)

(命名空间是System.Threading)。