我知道synchronize在方法带来同步到该对象之前使用关键字。也就是说,运行对象的同一实例的2个线程将被同步。
synchronize
但是,由于同步是在对象级别进行的,因此运行对象的不同实例的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锁的关键字,所以static变量count现在可以在class实例之间进行同步Test?
lock
synchronized
static
count
class
有几种同步对静态变量的访问的方法。
使用同步静态方法。这将在类对象上同步。
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是最好的,因为锁对象没有暴露在类之外。