Java中的ReentrantReadWriteLock使用详解
ReentrantReadWriteLock
ReadWriteLock即读写锁,ReadWriteLock的规则如下。
a.当有线程获取了Write锁时,其他线程不能获取到任何锁(写锁和读锁都不能。
b.当没有线程获取Wrete锁时,所有线程都可以获取Read锁。
c.当有Read锁存在时,获取不到Write锁。
1 ReentrantReadWriteLock实现类继承关系
可见该类实现了ReadWriteLock接口。
2 ReentrantReadWriteLock使用
创建一个读写锁。
static ReadWriteLock lock = new ReentrantReadWriteLock();
获取写锁。
lock.writeLock().lock();
释放写锁。
lock.writeLock().unlock();
获取读锁。
lock.readLock().lock();
释放读锁。
lock.readLock().unlock();
3 ReentrantReadWriteLock使用实例
该实例测试的是上边的规则c——当有Read锁存在时,获取不到Write锁。
让一个线程先获取到读锁并持有5秒钟。
这是其他线程尝试去获取写锁,发现5秒之后其他线程再开始写入然后在控制台打印出结果。
class ReadWriteLockDemo{ static ReadWriteLock lock = new ReentrantReadWriteLock(); static String text = "hello"; public static void modify(){ lock.writeLock().lock(); try { System.err.println(Thread.currentThread().getName()+"开始修改"); text += " "+Thread.currentThread().getName(); }catch (Exception e){ e.printStackTrace(); } finally { lock.writeLock().unlock(); } } public static void readWithReadLock(){ lock.readLock().lock(); try { System.err.println(text); Thread.sleep(5000); System.err.println("5秒过去了"); }catch (Exception e){ }finally { lock.readLock().unlock(); } } public static void main(String[] args) throws InterruptedException { new Thread(()->{ readWithReadLock(); }).start(); Thread.sleep(1000); for (int i=0;i<10;i++) { new Thread(() -> { modify(); }).start(); } } }
使用读写锁时需要需要明确上述三条规则。
并且可知,当读很多时,很难写入,所以读写锁不适用于读和写都很多的情况。
到此这篇关于Java中的ReentrantReadWriteLock使用详解的文章就介绍到这了,更多相关ReentrantReadWriteLock使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决2022.3.1版本中 IDEA中 XML文件提示屎黄色背景的方法
这篇文章主要介绍了解决2022.3.1版本中 IDEA中 XML文件屎黄色背景 的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-01-01如何在springboot中配置和使用mybatis-plus
这篇文章主要给大家介绍了关于如何在springboot中配置和使用mybatis-plus的相关资料,MyBatis Plus是MyBatis的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了MyBatis的灵活性和强大性能,需要的朋友可以参考下2023-11-11基于java springboot + mybatis实现电影售票管理系统
这篇文章主要介绍了基于java springboot + mybatis实现的完整电影售票管理系统基于java springboot + mybatis,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08springboot拦截器Interceptor的使用,你都了解吗
springmvc 中的拦截器可以对请求进行判别,在请求到达控制器之前,把非法的请求给拦截掉下面来说一说, 它在springboot中的使用,感兴趣的朋友一起看看吧2021-07-07
最新评论