1. 由于 counter是 static变量, 这里应该是对类加锁,而不是对象加锁.所以对counter的读写必须 synchronized static 方法. 否则可以同时有多个 IncrementImpl 对象可以同时调用increment()方法, 因为它们有各自的对象锁,不存在互斥的问题. 这样一来,就违反了程序对共享数据加锁的本来意图.
2. 在访问操作时,也应该加锁,用synchronized, 因为increment()不是原子操作, 另外的线程有可能在任意时刻读数据, 就会读取不稳定的中间状态的值.
正确的应该是:
public class IncrementImpl {
private static int counter = 0;
public synchronized static void increment() {
counter++;
}
public int synchronized static getCounter() {
return counter;
}
}
2. 在访问操作时,也应该加锁,用synchronized, 因为increment()不是原子操作, 另外的线程有可能在任意时刻读数据, 就会读取不稳定的中间状态的值.
正确的应该是:
public class IncrementImpl {
private static int counter = 0;
public synchronized static void increment() {
counter++;
}
public int synchronized static getCounter() {
return counter;
}
}