`

ReentrantReadWriteLock

 
阅读更多

感谢:多线程基础总结八--ReentrantReadWriteLock

 ReentReadWriteLock   // 可重入的读/写锁

   - 它和ReentrantLock都是单独的实现,不存在继承,实现的关系!

  -  它分读锁 和 写锁两部分!readLock() 和 writeLock()

  -   多个线程可以同时对一块资源进行读!但是,这是就不能进行写了!排斥写 ,因为读锁,并不涉及对资源的修改,也就不存在线程安全的问题!

  -  然而,写锁间却是互斥的!一个写锁套在某块资源上,别的线程就不能再读或写了!  读-读能共存,读-写不能共存,写-写不能共存

  -  重入方面,得到写锁后还可以再得到读锁!但是,读到读锁,你就不能再得到写锁了! 

  - 锁降级 : 获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不可能的

  

import java.util.HashMap;  
import java.util.Map;  
import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantReadWriteLock;  
  
/** 
 * @author: yanxuxin 
 * @date: 2010-1-7 
 */  
public class ReentrantReadWriteLockSample {  
  
    public static void main(String[] args) {  
        testReadLock();  
//      testWriteLock();  
    }  
   // 多线程的答案 说不准   
    public static void testReadLock() {  
       final ReadWriteLockSampleSupport support = new ReadWriteLockSampleSupport();  
        support.initCache();  
          
        Runnable runnable = new Runnable() {  
            public void run() {  
                support.get("test");  
            }  
        };  
      // 这两个是读操作,可以同时进行,不会被阻塞    
        new Thread(runnable).start();  
        new Thread(runnable).start();  
//          这个是写操作,必须等到读锁释放才能写
        new Thread(new Runnable() {  
            public void run() {  
                support.put("test", "test");  
            }  
        }).start();  
    }  
      
    public static void testWriteLock() {  
       final ReadWriteLockSampleSupport support = new ReadWriteLockSampleSupport();  
        support.initCache();  
//  两个写操作不能同时进行   ,在写的时候不能在读
        new Thread(new Runnable() {  
            public void run() {  
                support.put("key1", "value1");  
            }  
        }).start();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.put("key2", "value2");  
            }  
        }).start();  
          
        new Thread(new Runnable() {  
            public void run() {  
                support.get("key1");  
            }  
        }).start();  
    }  
}  
  
class ReadWriteLockSampleSupport {  
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();  
    private final Lock readLock = lock.readLock();  
    private final Lock writeLock = lock.writeLock();  
      
    private volatile  boolean completed;  
    private Map<String,String> cache;  
      
    public void initCache() {  
        readLock.lock();  
        if(!completed) {  
            // Must release read lock before acquiring write lock  
            readLock.unlock(); // (1)  // 读写锁的重入问题
            writeLock.lock();  // (2) 
            if(!completed) {  
                cache = new HashMap<String,String>(32);  
                completed = true;  
            }  
            // Downgrade by acquiring read lock before releasing write lock  
            readLock.lock();    // (3)  
            writeLock.unlock(); // (4) Unlock write, still hold read 锁降级  
        }  
          
        System.out.println("empty? " + cache.isEmpty());  
        readLock.unlock();  
    }  
      
    public String get(String key) {  
        readLock.lock();  
        System.out.println(Thread.currentThread().getName() + " read.");  
        startTheCountdown();  
        try{  
            return cache.get(key);  
        }  
        finally{  
            readLock.unlock();  
        }  
    }  
      
    public String put(String key, String value) {  
        writeLock.lock();  
        System.out.println(Thread.currentThread().getName() + " write.");  
        startTheCountdown();  
        try{  
            return cache.put(key, value);  
        }  
        finally {  
            writeLock.unlock();  
        }  
    }  
      
    /** 
     * A simple countdown,it will stop after about 5s.  
     */  
    public void startTheCountdown() {  
        long currentTime = System.currentTimeMillis();  
        for(;;) {  
            long diff = System.currentTimeMillis() - currentTime;  
            if(diff > 5000) {  
                break;  
            }  
        }  
    }  
}  
分享到:
评论

相关推荐

    08、读写锁ReentrantReadWriteLock&StampLock详解-ev

    读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁ReentrantReadWriteLock&StampLock详解_e读写锁...

    深入浅出ReentrantReadWriteLock源码解析.docx

    【深入浅出ReentrantReadWriteLock源码解析】 ReentrantReadWriteLock是Java并发包中的一个核心类,它提供了读写锁的实现,使得多个线程可以并发读取共享资源,但写操作是互斥的,即同一时间只能有一个线程进行写...

    8、读写锁ReentrantReadWriteLock&StampLock详解.pdf

    根据提供的文件信息,本文将详细解析读写锁`ReentrantReadWriteLock`以及`StampLock`在Java并发编程中的应用场景及其实现原理。 ### 一、读写锁介绍 #### 1.1 读写锁的基本概念 读写锁是一种特殊的锁机制,它可以...

    Java 多线程与并发(12-26)-JUC锁- ReentrantReadWriteLock详解.pdf

    在Java多线程并发编程中,ReentrantReadWriteLock(可重入读写锁)是一个重要的同步工具,它属于Java并发包(java.util.concurrent.locks)中的一个类。这个锁提供了比标准的synchronized关键字更细粒度的控制,允许...

    ReadWriteLock接口及其实现ReentrantReadWriteLock方法

    ReadWriteLock 接口及其实现 ReentrantReadWriteLock 方法 在 Java 并发编程中,锁机制是非常重要的一种同步机制,用于解决多线程之间的资源竞争问题。在 Java 中,有多种锁机制,如 ReentrantLock、...

    60.Lock-ReentranLock-ReentrantReadWriteLock.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Java多线程 ReentrantReadWriteLock原理及实例详解

    Java的ReentrantReadWriteLock是Java并发包`java.util.concurrent.locks`中的一个重要工具,它提供了一种更细粒度的锁定机制,相比普通的独占锁(如ReentrantLock)在某些场景下能显著提高程序的并发性能。...

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4

    6.5 深入理解 AQS之 ReentrantReadWritelock 实战副本副本.mp4

    ReentrantReadWriteLock.xmind

    ReentrantReadWriteLock 读写锁除了保证写操作对读操作可见性以及并发行提升外,简化了读写交互场景开发

    ReadWriteLock的使用

    ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。

    contention-profiling:ReentrantLock 和 ReentrantReadWriteLock 上的配置文件争用

    `ReentrantLock`和`ReentrantReadWriteLock`是Java并发包`java.util.concurrent.locks`中的两个重要工具,它们提供了比标准`synchronized`关键字更高级别的锁控制机制。本文将深入探讨这两个类,以及如何通过配置...

    Java concurrency之共享锁和ReentrantReadWriteLock_动力节点Java学院整理

    本篇文章主要介绍了Java concurrency之共享锁和ReentrantReadWriteLock,非常具有实用价值,需要的朋友可以参考下

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

    ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(); ``` 然后通过以下方式获取读锁和写锁: ```java ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock...

    Java的两种读写锁介绍

    本文将深入探讨Java中的两种读写锁:ReentrantReadWriteLock和StampedLock,并分析它们的工作原理、特点以及如何在实际开发中进行应用。 一、ReentrantReadWriteLock(可重入读写锁) 1. **简介**: ...

    reader and writer

    ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); ReadLock readLock = lock.readLock(); WriteLock writeLock = lock.writeLock(); ``` 2. **读者部分**:当一个线程想要读取数据时,它需要获取读锁...

    读者写者公平操作

    ReentrantReadWriteLock lock = new ReentrantReadWriteLock(true); // 公平锁 ``` 然后,我们可以定义读操作和写操作的方法: 对于读者: ```java public void read() { lock.readLock().lock(); try { // 读取...

    homework-ReadWriteLock-KristampsW-main.zip

    - `ReentrantReadWriteLock`是Java提供的可重入的读写锁实现,它继承自`AbstractQueuedSynchronizer`(AQS)。可重入意味着一个线程可以多次获取同一锁,这在递归调用或者锁嵌套时很有用。 - **公平性**:`...

    读写锁_读写锁_

    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private final LinkedList&lt;String&gt; list = new LinkedList(); public void add(String item) { lock.writeLock().lock(); try { ...

Global site tag (gtag.js) - Google Analytics