首页 > 编程语言 >ReentrantReadWriteLock源码剖析

ReentrantReadWriteLock源码剖析

时间:2024-09-01 14:14:21浏览次数:12  
标签:读取数据 Thread ReentrantReadWriteLock -- value 剖析 源码 public

ReentrantReadWriteLock源码剖析

测试案例:

public class ReentrantReadWriteLockDemo {

    private static ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    private static Lock readLock = readWriteLock.readLock(); // 定义读锁
    private static Lock writeLock = readWriteLock.writeLock(); // 定义写锁
    private int value = 10;

    public static void main(String[] args) {
        new ReadWriteLockDemo().test();
    }

    private void test() {
        for (int j = 0; j < 30; j++) {
            if (j % 5 == 0) {
                new Thread(this::doWrite).start();
            } else {
                new Thread(this::doRead).start();
            }
        }
    }

    // 读取value的值
    private void doRead() {
        try {
            readLock.lock(); // 上读锁
            long timeFlag = System.currentTimeMillis() % 100000;
            System.out.println(timeFlag + " -- " + Thread.currentThread().getName() + " -->> 读取数据 value=" + value);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            readLock.unlock(); // 释放读锁
        }
    }

    // 修改value的值
    private void doWrite() {
        try {
            writeLock.lock(); // 添加写锁
            value++;
            long timeFlag = System.currentTimeMillis() % 100000;
            System.out.println(timeFlag + " -- " + Thread.currentThread().getName() + " -->> <<写入>>数据 value=" + value);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            writeLock.unlock(); // 释放写锁
        }
    }
}

运行结果:

30731 -- Thread-0 -->> <<写入>>数据 value=11
31732 -- Thread-5 -->> <<写入>>数据 value=12
32733 -- Thread-1 -->> 读取数据 value=12
32733 -- Thread-2 -->> 读取数据 value=12
32733 -- Thread-4 -->> 读取数据 value=12
32733 -- Thread-7 -->> 读取数据 value=12
32734 -- Thread-3 -->> 读取数据 value=12
32734 -- Thread-8 -->> 读取数据 value=12
32734 -- Thread-6 -->> 读取数据 value=12
32734 -- Thread-9 -->> 读取数据 value=12
33735 -- Thread-10 -->> <<写入>>数据 value=13
34735 -- Thread-11 -->> 读取数据 value=13
34735 -- Thread-12 -->> 读取数据 value=13
34735 -- Thread-13 -->> 读取数据 value=13
34735 -- Thread-14 -->> 读取数据 value=13
35736 -- Thread-15 -->> <<写入>>数据 value=14
36736 -- Thread-16 -->> 读取数据 value=14
36736 -- Thread-17 -->> 读取数据 value=14
36736 -- Thread-18 -->> 读取数据 value=14
36736 -- Thread-19 -->> 读取数据 value=14
37737 -- Thread-20 -->> <<写入>>数据 value=15
38738 -- Thread-21 -->> 读取数据 value=15
38738 -- Thread-23 -->> 读取数据 value=15
38738 -- Thread-22 -->> 读取数据 value=15
38738 -- Thread-24 -->> 读取数据 value=15
39738 -- Thread-25 -->> <<写入>>数据 value=16
40738 -- Thread-26 -->> 读取数据 value=16
40738 -- Thread-27 -->> 读取数据 value=16
40738 -- Thread-29 -->> 读取数据 value=16
40738 -- Thread-28 -->> 读取数据 value=16

架构图:

image

源码剖析:

public class ReentrantReadWriteLock
        implements ReadWriteLock, java.io.Serializable {
	
    /** Inner class providing readlock 读锁,内部类提供*/
    private final ReentrantReadWriteLock.ReadLock readerLock;
    /** Inner class providing writelock 写锁,内部类提供*/
    private final ReentrantReadWriteLock.WriteLock writerLock;
    
    final Sync sync;// 继承AQS
    
    abstract static class Sync extends AbstractQueuedSynchronizer {
        // 位数
    	static final int SHARED_SHIFT   = 16;
        // 共享⾼16位(读锁标记)
        static final int SHARED_UNIT    = (1 << SHARED_SHIFT);
        // 读取最⼤数量
        static final int MAX_COUNT      = (1 << SHARED_SHIFT) - 1;
        // 写锁最⼤数量
        static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;
        
        /** Returns the number of shared holds represented in count 读锁计数 */
        static int sharedCount(int c)    { return c >>> SHARED_SHIFT; }
        /** Returns the number of exclusive holds represented in count 写锁计数 */
        static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }
    }
    
    // 非公平锁
    static final class NonfairSync extends Sync {
        // ......
    }
    // 公平锁
    static final class FairSync extends Sync {
        // ......
    }
    
    // 读锁
    public static class ReadLock implements Lock, java.io.Serializable {
    	// ......
    }
    // 写锁    
    public static class WriteLock implements Lock, java.io.Serializable {
    	// ......
    }
    
    public ReentrantReadWriteLock() {
        this(false);
    }
    
    public ReentrantReadWriteLock(boolean fair) {
        // true:公平锁 false:非公平锁
        sync = fair ? new FairSync() : new NonfairSync();
        readerLock = new ReadLock(this);
        writerLock = new WriteLock(this);
    }

}

加锁:

java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock#lock
可以看到底层走的还是AQS的逻辑

public void lock() {
	sync.acquireShared(1);
}

public final void acquireShared(int arg) {
    if (tryAcquireShared(arg) < 0)
    doAcquireShared(arg);
}

java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock#lock
可以看到底层走的还是AQS的逻辑   
public void lock() {
    sync.acquire(1);
}

public final void acquire(int arg) {
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

释放锁

java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock#unlock
可以看到底层走的还是AQS的逻辑
public void unlock() {
    sync.releaseShared(1);
}

public final boolean releaseShared(int arg) {
    if (tryReleaseShared(arg)) {
        doReleaseShared();
        return true;
    }
    return false;
}

java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock#unlock
可以看到底层走的还是AQS的逻辑
public void unlock() {
    sync.release(1);
}

public final boolean release(int arg) {
    if (tryRelease(arg)) {
        Node h = head;
        if (h != null && h.waitStatus != 0)
            unparkSuccessor(h);
        return true;
    }
    return false;
}

总的来说:ReentrantReadWriteLock底层实现了公平锁、非公平锁、读锁和写锁。

标签:读取数据,Thread,ReentrantReadWriteLock,--,value,剖析,源码,public
From: https://www.cnblogs.com/dongyaotou/p/18391256

相关文章

  • ReentrantLock源码剖析
    ReentrantLock源码剖析测试案例:publicclassReentrantLockDemo{//ReentrantLocklock=newReentrantLock();//默认是非公平锁//ReentrantLocklock=newReentrantLock(true);//true:公平锁,false:非公平锁publicstaticvoidmain(String[]args){......
  • 毕业设计-基于Springboot+Vue的大学生租房系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89456841基于SpringBoot+Vue的大学生租房系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1oXxVE3PeuLS5YOJvYjvKKw?pwd=......
  • 基于Springboot快递物流仓库管理系统【附源码+文档】
    ......
  • 【有源码】基于springboot+vue的高校大学生创新创业学分管理系统的设计与实现
    注意:该项目只展示部分功能,如需了解,文末咨询即可。本文目录1.开发环境2系统设计2.1设计背景2.2设计内容3系统展示3.1功能展示视频3.2前台页面3.3后台页面4更多推荐5部分功能代码1.开发环境开发语言:Java采用技术:sprngboot、vue数据库:MySQL开发环境:In......
  • 校园便利|基于SprinBoot+vue的校园便利平台(源码+数据库+文档)
    校园便利平台基于SprinBoot+vue的校园便利平台一、前言二、系统设计三、系统功能设计 系统前台实现系统首页功能用户后台管理功能管理员功能实现四、数据库设计 五、核心代码 六、论文参考七、最新计算机毕设选题推荐八、源码获取:博主介绍:✌️大厂码农|毕设......
  • “事事通”校园事务通知小程序的设计与实现-计算机毕业设计源码23598
    摘要 校园事务是大学生日常生活中不可或缺的一部分,包括课程查询、教务管理、校园活动信息等。然而,目前大多数学校在校园事务的通知发布和信息查询方面还依赖传统的官方网站和邮件通知,这种方式存在信息不及时、查找不方便等问题。本文旨在通过引入SpringBoot和Vue框架,结合云......
  • 基于大数据的智慧社区服务系统设计与实现-计算机毕业设计源码+LW文档
    摘要随着信息技术的迅猛发展,大数据已经成为现代社会的重要资源。在智慧城市建设的大背景下,社区作为城市的基本单元,其服务水平直接关系到居民的生活质量和城市的整体形象。因此,利用大数据技术提升社区服务水平,构建智慧社区服务系统,成为当前研究的热点。通过智慧社区服务系统,可以实......
  • Java计算机毕业设计校园闲置物品租赁系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今快速发展的校园环境中,学生群体对于资源的利用效率与可持续性日益重视。随着教育资源的不断丰富和个人需求的多样化,学生们常面临购买成本高、使......
  • Java计算机毕业设计易行汽车租赁平台(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和居民生活水平的提高,汽车租赁作为一种灵活、便捷的出行方式,正逐渐成为现代都市人出行的首选。易行汽车租赁平台应运而生,旨在通......
  • Java计算机毕业设计闲置交易系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着消费观念的转变和共享经济的蓬勃发展,闲置物品交易逐渐成为人们处理不再使用但仍有价值的物品的重要方式。传统二手市场存在信息不对称、交易效率......