`

ReentrantReadWriteLock

阅读更多

1) 背景
    jni的使用场景,多线程读,单线程写,写的时候会更新java对象,当老的java对象无须再使用的时候必须释放jni所占用本地方法区的内存,这个区域的内存不在java heap范畴,因此也无法被垃圾回收掉,需要显式的释放。

但问题在于什么释放?

有人会说使用finalize,但finalize过于依赖jvm的回收的时机,这使得什么时候能真正释放显得不太好预测。

或者使用synchronized 内部锁,这样会导致性能的下降,为了极少量的写牺牲了大量的读。

释放的时机确实不太好把握,因为必须等待所有对于老的java对象的读线程访问完毕才能释放,否者jvm会崩溃。

恰好ReentrantReadWriteLock可以满足这个要求


2)ReentrantReadWriteLock竞争条件

ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁

线程进入读锁的前提条件:
    没有其他线程的写锁,
    没有写请求或者有写请求,但调用线程和持有锁的线程是同一个

线程进入写锁的前提条件:
    没有其他线程的读锁
    没有其他线程的写锁


3)样例代码

view plaincopy to clipboardprint?
01.。。。。。。  
02.private SomeClass someClass;  //锁的资源  
03.private final ReadWriteLock lock = new ReentrantReadWriteLock();  
04.private final Lock r = lock.readLock();  
05.private final Lock w = lock.writeLock();  
06.。。。。。。  
07.//读方法  
08.。。。。。。  
09.r.lock();  
10.try {  
11.    result = someClass.someMethod();  
12.} catch (Exception e) {  
13.    // process  
14.} finally {  
15.    r.unlock();  
16.}  
17.。。。。。。。  
18.//写方法  
19.。。。。。。  
20.//产生新的SomeClass实例tempSomeClass  
21.。。。。。。。  
22.         
23.w.lock();  
24.try{  
25.    //释放老的资源  
26.    this.someClass.dispose();  
27.    //更新成新的实例  
28.    this.someClass = tempSomeClass;  
29.}finally{  
30.    w.unlock();  
31.}  
32.。。。。。。。 
。。。。。。
private SomeClass someClass;  //锁的资源
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock r = lock.readLock();
private final Lock w = lock.writeLock();
。。。。。。
//读方法
。。。。。。
r.lock();
try {
    result = someClass.someMethod();
} catch (Exception e) {
    // process
} finally {
    r.unlock();
}
。。。。。。。
//写方法
。。。。。。
//产生新的SomeClass实例tempSomeClass
。。。。。。。
      
w.lock();
try{
    //释放老的资源
    this.someClass.dispose();
    //更新成新的实例
    this.someClass = tempSomeClass;
}finally{
    w.unlock();
}
。。。。。。。

很简单的代码就解决了我们的问题

4)性能测试

接下来对比下使用ReentrantReadWriteLock和不使用任何锁的性能比较情况:
我们使用100个读线程并发进行压力测试,发现在100%读的情况,性能没有任何损失,

之后我们在100个读线程的基础上加了一个写线程,每分钟写一次,性能几乎没有损失。

5)小结
使用ReentrantReadWriteLock可以推广到大部分读,少量写的场景,因为读线程之间没有竞争,所以比起sychronzied,性能好很多。
如果需要较为精确的控制缓存,使用ReentrantReadWriteLock倒也不失为一个方案。

 

出处:http://blog.csdn.net/pwlazy/archive/2010/06/01/5640286.aspx

分享到:
评论

相关推荐

    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<String> list = new LinkedList(); public void add(String item) { lock.writeLock().lock(); try { ...

Global site tag (gtag.js) - Google Analytics