如何在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的访问。
-
使用同步的静态方法。 这在类对象上进行同步。
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在许多情况下是最好的,因为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)。