众所周知,simplex++
不是原子操作,实际上是读-增量-写操作。这就是为什么它应该同步。但是呢get()
?我读过它也应该同步,但有人能解释一下为什么吗?通过引入happens-before
关系来避免内存一致性错误?如果get()
经常被多个线程调用并且值很少更改的情况呢?不是synchronized get()
让他们慢下来吗?在这种情况下是否有其他方法可以实现同步(不使用 AtomicInteger)?volatile
关键字在这里有用吗?
public class Counter {
private int value;
public synchronized int get() { return value; }
public synchronized int increment() { return ++value; }
public synchronized int decrement() { return --value; }
}
谢谢!
编辑:
我想澄清一下。使用volatile
我的意思是引入该关键字并synchronized
在get()
方法中删除。我想知道它是否会使其成为线程安全的,但如果许多线程正在读取该值并且一个很少更改它,它是否也会更有效。