随笔 - 458  文章 - 0  评论 - 11  阅读 - 39万

Java Concurrency - ReadWriteLock & ReentrantReadWriteLock

锁所提供的最重要的改进之一就是 ReadWriteLock 接口和它的实现类 ReentrantReadWriteLock。这个类提供两把锁,一把用于读操作和一把用于写操作。同一时间可以有多个线程执行读操作,但只有一个线程可以执行写操作。当一个线程正在执行一个写操作,不可能有任何线程执行读操作。

复制代码
public class VisitCounter {

    private ReadWriteLock lock;
    
    private long counter;
    
    public VisitCounter() {
        counter = 0;
        lock = new ReentrantReadWriteLock();
    }
    
    public long get() {
        long result = -1;
        lock.readLock().lock();
        try {
            // System.out.println(Thread.currentThread().getName() + "准备查询访客计数器……" + ", " + new Date());
            result = queryCounter();
            // System.out.println(Thread.currentThread().getName() + "查得访客计数器值为" + result + ", " + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.readLock().unlock();
        }
        return result;
    }
    
    public void increase() {
        lock.writeLock().lock();
        try {
            // System.out.println("新增访客:" + Thread.currentThread().getName() + ", " + new Date());
            updateCounter();
            // System.out.println(Thread.currentThread().getName() + "更新访客计数器完毕……" + ", " + new Date());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.writeLock().unlock();
        }
    }
    
    private long queryCounter() throws Exception {
        Thread.sleep((long)(Math.random() * 10000));
        return counter;
    }
    
    private void updateCounter() throws Exception {
        Thread.sleep((long)(Math.random() * 10000));
        counter++;
    }
}
复制代码

正如前面提及到的,ReentrantReadWriteLock 类有两把锁,一把用于读操作,一把用于写操作。用于读操作的锁,是通过在 ReadWriteLock 接口中声明的 readLock() 方法获取的。这个锁是实现 Lock 接口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。用于写操作的锁,是通过在 ReadWriteLock 接口中声明的 writeLock() 方法获取的。这个锁是实现 Lock 接 口的一个对象,所以我们可以使用 lock(),unlock() 和 tryLock() 方法。确保正确的使用这些锁,使用它们与被设计的目的是一样的,这是程序员的职责。当获得 Lock 接口的读锁时,不能修改变量的值。否则,可能会有数据不一致的错误。

posted on   huey2672  阅读(170)  评论(0编辑  收藏  举报
编辑推荐:
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
阅读排行:
· 盘点!HelloGitHub 年度热门开源项目
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 2. 什么?你想跨数据库关联查询?
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示