`

ReentranReadWriteLock的WriteLock源码解读

阅读更多
//ReentrantReadWriteLock的WriteLock
//WriteLock的lock方法

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

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


 protected final boolean tryAcquire(int acquires) {
          
            Thread current = Thread.currentThread();
	    //获取state状态
            int c = getState();
            int w = exclusiveCount(c);
	    //如果c不为0说明当前有线程获取了锁
            if (c != 0) {
                // (Note: if c != 0 and w == 0 then shared count != 0)
		//当前线程不是当前正在运行的独占线程
                if (w == 0 || current != getExclusiveOwnerThread())
                    return false;
                if (w + exclusiveCount(acquires) > MAX_COUNT)
                    throw new Error("Maximum lock count exceeded");
                // Reentrant acquire
                setState(c + acquires);
                return true;
            }
            if (writerShouldBlock() ||
                !compareAndSetState(c, c + acquires))
                return false;
            setExclusiveOwnerThread(current);
            return true;
        }


 final boolean writerShouldBlock() {
            return false; // writers can always barge
        }


//WriteLock简单来说就是判断当前有没有线程占用锁,有则入队等待唤醒。没有直接占用运行。


WriteLock的unlock方法:
 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;
    }
//设置状态以及将独占线程设置为null
protected final boolean tryRelease(int releases) {
            if (!isHeldExclusively())
                throw new IllegalMonitorStateException();
            int nextc = getState() - releases;
            boolean free = exclusiveCount(nextc) == 0;
            if (free)
                setExclusiveOwnerThread(null);
            setState(nextc);
            return free;
        }





//WriteLock的其他方法和Reentrant基本一致。WriteLock本身就相当于ReentrantLock互斥锁。
分享到:
评论

相关推荐

    深入浅出ReentrantReadWriteLock源码解析.docx

    其中,`readLock()`和`writeLock()`方法分别用于获取读锁和写锁,它们使用CAS操作来保证线程安全。在读锁的实现中,ReentrantReadWriteLock支持读锁的重入,而写锁同样支持重入,但写锁具有更高的优先级,即使有多个...

    同步读锁,异步互斥写锁源码

    本主题将深入探讨“同步读锁”和“异步互斥写锁”的概念、实现原理以及源码分析,主要以`LockDemo`为例进行阐述。 首先,我们需要了解锁的基本类型:互斥锁(Mutex)和读写锁(Read-Write Lock)。互斥锁提供独占式...

    计算机软件-商业源码-利用读写锁保持线程同步.zip

    在计算机编程领域,特别是在多线程并发环境下,保持线程同步是至关重要的。..."计算机软件-商业源码-利用读写锁保持线程同步.zip"这个压缩包很可能包含了这样的示例代码,可以帮助开发者更好地理解并实践读写锁的用法。

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    基于JDK源码解析Java并发锁,我们需要关注以下几个关键知识点: 1. **AQS(AbstractQueuedSynchronizer)基础同步器**: AQS是一个用于构建锁和同步器的框架,它维护了一个FIFO的等待队列,提供了两种模式:独占和...

    homework-ReadWriteLock-KristampsW-main.zip

    在Java中,`java.util.concurrent.locks.ReadWriteLock`接口提供了这种功能,它有两个主要的方法:`readLock()` 和 `writeLock()`. 这两个方法分别返回一个读锁和写锁,它们可以被不同的线程独立获取和释放,从而...

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    lock.writeLock().unlock(); } } public String get(String key) { lock.readLock().lock(); try { return map.get(key); } finally { lock.readLock().unlock(); } } ``` 2. **其他策略**:根据具体...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock(); ``` 使用读锁和写锁的方式如下: ```java // 获取读锁 readLock.lock(); try { // 读操作 } finally { readLock.unlock(); ...

    java 读写锁代码

    - 它提供了`ReadLock`和`WriteLock`接口,分别代表读锁和写锁,可以通过`lock()`和`unlock()`方法来获取和释放锁。 3. **读写锁的应用**: - 在需要大量并发读取,偶尔修改的数据结构中,使用读写锁能有效提高...

    reader and writer

    WriteLock writeLock = lock.writeLock(); ``` 2. **读者部分**:当一个线程想要读取数据时,它需要获取读锁。 ```java readLock.lock(); try { // 读取数据的操作 } finally { readLock.unlock(); } ``` 3. **...

    writerandreader.rar_读者写者_读者写者问题

    - `writeLock`:二进制信号量,表示写者是否正在写入,初始化为1,表示无写者。 2. **读者进程**: - 请求`writeLock`,确保没有写者正在写入。 - 增加`readCount`,表示有一个新的读者开始读取。 - 如果还有...

    slock-js, slock框架的后端.zip

    slock.writeLock(async () => { resource.value++; }); // 读锁 slock.readLock(async () => { console.log(`Current value: ${resource.value}`); }); ``` ### 5. 深入学习 `slock-js-master`目录包含了`slock...

    23 按需上锁—ReadWriteLock详解.pdf

    Lock writeLock = lock.writeLock(); // 获取写锁 writeLock.lock(); System.out.println("got the write lock"); // 降级到读锁 readLock.lock(); System.out.println("got the read lock"); // 释放锁 ...

    读写锁_读写锁_

    lock.writeLock().lock(); try { list.add(item); } finally { lock.writeLock().unlock(); } } public void remove(String item) { lock.writeLock().lock(); try { list.remove(item); } finally { ...

    完整word版-北航研究生课程程序设计语言原理16-17期末试题.doc

    private final ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); public void read() { readLock.lock(); try { // 读取操作 } finally { readLock.unlock(); } } public void write() ...

    Reader-Writer-lock

    WriteLock writeLock = lock.writeLock(); writeLock.lock(); // 获取写锁 // 写入操作 writeLock.unlock(); // 释放写锁 ``` ### 4. 可重入性 `ReentrantReadWriteLock`支持可重入性,这意味着一个线程在持有读锁...

    读写锁实现例子

    读写锁的核心在于它的两个主要方法:`ReadLock()` 和 `WriteLock()`。在读写锁实现的例子中,`CRWMutex` 类是读写锁的实现类,它包含了一些辅助类 `RLock` 和 `WLock` 用于简化读写锁的获取和释放过程。 `RLock` 类...

    C#.net程序示例[参考].pdf

    接着,调用WriteLock函数写入数据,如:`libcdll5.WriteLock(1, Lockdata, password)`,其中`password`是写入操作的密码。 正式的加密过程分为多个步骤: 1. 确保CSample程序在未加密状态下能够正常运行。 2. 使用...

    多线程面试题及处理方案和详解

    - **writeLock()**:获取写锁。 - **unlock()**:释放锁。 #### 四、线程池源码分析 - **核心组件**: - **ExecutorService**:提供了一个高级接口来创建和管理线程。 - **ThreadPoolExecutor**:实现`...

    读者写者公平操作

    在公平模式下,`readLock().lock()`和`writeLock().lock()`会遵循FIFO(先进先出)原则,等待最久的线程将首先获得锁。当一个写者在写入时,所有读者和写者都会被阻塞;当写者完成写入并释放写锁后,如果有等待的...

    ReadWriteLock接口及其实现ReentrantReadWriteLock方法

    在 ReentrantReadWriteLock 中,有两个内部类:ReadLock 和 WriteLock,这两个内部类分别实现了读锁和写锁的功能。 ReadLock 和 WriteLock ReadLock 和 WriteLock 都是 ReentrantReadWriteLock 的内部类,它们实现...

Global site tag (gtag.js) - Google Analytics