Java中int字段的线程安全性



如果类有int类型的字段(不是Atomic Integer,也没有volatile关键字(,并且对该字段的所有访问都在读/写锁下进行-在这种情况下,该字段线程安全吗?或者在某个时刻,某个线程可以看到的不是这个字段的实际值,而是缓存中的一些内容?

public static class Example {
private int isSafe;
private final ReadWriteLock lock;

public Example(int i) {
isSafe = i;
lock = new ReentrantReadWriteLock();
}

public int getIsSafe() {
final Lock lock = this.lock.readLock();
lock.lock();
try {
return isSafe;
} finally {
lock.unlock();
}
}
public void someMethod1() {
final Lock lock = this.lock.writeLock();
lock.lock();
try {
isSafe++;
} finally {
lock.unlock();
}
}

}
是的,这种方法是线程安全的。如果没有线程请求写锁和写锁,那么多个线程可以锁定读锁。这意味着,只要没有线程写入数据或更新数据,多个线程就可以在同一时刻读取数据。

在问题下的评论中从@pveentjer获得答案:

了解现代cpu上的缓存总是由于像MESI这样的高速缓存一致性协议而具有一致性。另一个重要的是要理解正确同步的程序表现出顺序一致性行为并实现顺序一致性实时订单并不相关。所以读写可能会出现偏差只要没有人能够观察到违反程序顺序的行为。

最新更新