Java中int字段的线程安全性:读写锁保护下是否安全?
读写锁保护下int字段的线程安全性分析
问题
如果Java类里有个int类型字段(不是AtomicInteger,也没加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(); } } }
解答
该字段具备线程安全性
你使用的ReentrantReadWriteLock自带内存可见性和互斥性保障:
- 写锁释放时会将更新后的
isSafe值同步到主内存,读锁获取时会强制从主内存加载最新值; - 写操作(
isSafe++)被写锁完全互斥保护,避免了多线程同时修改导致的竞态问题,保证了自增操作的原子性; - 所有对
isSafe的访问都严格通过锁管控,没有裸操作的情况,因此整个字段的操作是线程安全的。
不会出现读取缓存过期值的情况
ReentrantReadWriteLock的锁机制符合Java内存模型(JMM)的规范:
- 线程释放写锁时会触发内存屏障,将线程本地缓存的修改同步到主内存;
- 其他线程获取读锁时同样会触发内存屏障,强制从主内存读取最新值,不会依赖线程本地缓存中的旧数据。
只要所有读写操作都通过锁来执行,就不会出现读取过期缓存值的问题。
内容的提问来源于stack exchange,提问作者dallin_sh
相关产品推荐
相关产品推荐

