zoukankan      html  css  js  c++  java
  • Java中的读写锁ReadWriteLock

    ReadWriteLock 是 JDK 中的读写锁接口

    ReentrantReadWriteLock 是 ReadWriteLock 的一种实现

    读写锁非常适合读多写少的场景。读写锁与互斥锁的一个重要区别是读写锁允许多个线程同时读共享变量,这是读写锁在读多写少的情况下性能较高的原因。

    读写锁的原则:

    • 多个线程可同时读共享变量
    • 只允许一个线程写共享变量
    • 写线程正在执行写操作,禁止其他线程读写共享变量

    升级与降级:

    • ReadWriteLock 不支持锁的升级。即线程先获得读锁,再获取写锁,这样会导致死锁
    • ReadWriteLock 支持锁的降级。即先获取写锁,再获取读锁,释放写锁,释放读锁
    • ReadWriteLock 中只有写锁支持条件变量,读锁调用 newCondition() 方法,会抛出 UnsupportedOperationException 异常

    读写锁的应用示例:

    package constxiong.interview;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    /**
     * 测试 读写锁
     * @author ConstXiong
     * @date 2019-12-19 10:40:45
     */
    public class TestReadWriteLock {
    
        final static ReadWriteLock rwLock = new ReentrantReadWriteLock();
        
        final static Lock readLock = rwLock.readLock();//读锁
        
        final static Lock writeLock = rwLock.writeLock();//写锁
        
        static int count = 0;
        
        public static void main(String[] args) {
            for (int i = 0; i < 100; i++) {
                new Thread(() -> {
                    System.out.println(Thread.currentThread().getName() + ":" + get());
                }).start();
            }
            
            for (int i = 0; i < 3; i++) {
                new Thread(() -> {
                    System.out.println(Thread.currentThread().getName() + " add");
                    add();
                }).start();
            }
        }
        
        private static int get() {
            readLock.lock();
            try {
                return count;
            } finally {
                readLock.unlock();
            }
        }
        
        private static void add() {
            writeLock.lock();
            try {
                count++;
            } finally {
                writeLock.unlock();
            }
        }
        
    }


    原文链接
     


     

  • 相关阅读:
    实战-百度云[大文件/文件夹]下载限制破解
    IOCP之客户端及消息传递
    IOCP简单实现
    Charles V4系列更新 | 绿色特别版 | 视频教程
    Charles 3.11.5 绿色特别版
    VC运行库合集2005/2008/2010/2012/2013/2015
    手游测试之《弱网测试》
    后端性能测试不可不知的二三事
    linux性能指标及分析工具
    Shell笔记-04
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/12071370.html
Copyright © 2011-2022 走看看