首页 > 其他分享 >ReentrantReadWriteLock

ReentrantReadWriteLock

时间:2023-04-20 16:02:09浏览次数:39  
标签:释放 java ReentrantReadWriteLock someClass private 线程


 

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

但问题在于什么释放?

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

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

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

恰好ReentrantReadWriteLock可以满足这个要求

2)ReentrantReadWriteLock竞争条件

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

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

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

2)样例代码

[java]  
   view plain 
   copy 
   
 
   
 
 
1. 。。。。。。  
2. private SomeClass someClass;  //锁的资源
3. private final ReadWriteLock lock = new
4. private final
5. private final
6. 。。。。。。  
7. //读方法
8. 。。。。。。  
9. r.lock();  
10. try
11.     result = someClass.someMethod();  
12. } catch
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. 。。。。。。。

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

4)性能测试

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

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

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

标签:释放,java,ReentrantReadWriteLock,someClass,private,线程
From: https://blog.51cto.com/u_2465818/6209771

相关文章

  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock之ReadLock读锁原理
    1 前言上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。2 线程读锁记录回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁:publicclassReentrantReadWriteLockTest{//声明一个读写锁privatestaticR......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock 读写锁怎么表示
    1 前言接下来我们来看看ReentrantReadWriteLock读写锁,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类,这个锁很重要,在很多开源的中间件中使用的非常广泛,很多场景使用它来减少并发操作中的锁冲突,提升并发能力。2  ReentrantReadWriteLock介绍ReentrantRead......
  • 读写锁(ReentrantReadWriteLock)
    读写锁​​1、读写锁介绍​​​​2、读写锁入门案例​​​​3、锁降级测试​​​​4、小结​​1、读写锁介绍  现实中有这样一种场景:对共享资源有读和写的操作,且写操作没......
  • Java并发编程——ReentrantReadWriteLock原理
    一、读写锁有这样一种场景:1、如果对一个共享资源的写操作没有读操作那么频繁,这个时候可以允许多个线程同时读取共享资源;2、但是如果有一个线程想去写这些共享资源,那么其......
  • ReentrantReadWriteLock读写锁和StampedLock邮戳锁
    ReentrantReadWriteLock读写锁定义:一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程,只有在读多写少的情况下,读写锁才有较高的性能体现。缺点......
  • JUC源码学习笔记6——ReentrantReadWriteLock
    系列文章目录和关于我阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读:1.JUC源码学习笔记1——AQS独占模式和ReentrantLock2.JUC源码学习笔记2——AQS共享和Semaphore......
  • Java并发编程一ReentrantReadWriteLock初使用
    推荐:​​Java并发编程汇总​​Java并发编程一ReentrantReadWriteLock初使用​​ReentrantReadWriteLock​​是一种读写锁,从类名也可以看出来。​​ReentrantReadWriteLock​......
  • ReentrantReadWriteLock 使用示例
    ReadWriteLock使用示例1.使用场景前两天同事发给我一个工具类,封装了调用第三方接口的方法。第三方接口调用需要带上访问凭据accessToken,需要先调用login接口传入usern......