You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:40:32