iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java并发编程中ReentrantLock可重入读写锁
  • 547
分享到

java并发编程中ReentrantLock可重入读写锁

2024-04-02 19:04:59 547人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、ReentrantLock可重入锁二、ReentrantReadWriteLock读写锁三、读锁之间不互斥一、ReentrantLock可重入锁 可重入锁ReentrantL

一、ReentrantLock可重入锁

可重入锁ReentrantLock 是一个互斥锁,即同一时间只有一个线程能够获取锁定资源,执行锁定范围内的代码。这一点与synchronized 关键字十分相似。其基本用法代码如下:

Lock lock = new ReentrantLock();  //实例化锁
//lock.lock(); //上锁
boolean locked = lock.tryLock();  //尝试上锁
if(locked){
  try {
    //被锁定的同步代码块,同时只能被一个线程执行
  }finally {
    lock.unlock(); //放在finally代码块中,保证锁一定会被释放
  }
}

通过lock函数获取锁,通过unlock函数释放锁。非常重要的是,需要把需要同步执行的代码放入 try/finally 代码块中,并在finally中将锁释放。ReentrantLock是可重入锁,即:(lock/unlok)动作里面可以嵌套(lock/unlock),针对同一个锁可以多次嵌套使用,不会产生死锁。但是lock函数与unlock函数在代码中必须成对出现,否则会出现死锁

二、ReentrantReadWriteLock读写锁

ReentrantReadWriteLock类为读写锁实现类,针对某一个对象或可变变量,只要没有线程在修改它,这个对象或可变变量就可以同时被多个线程读取。ReentrantReadWriteLock将锁分为读锁和写锁,只要没有线程持有写锁的情况下,读锁可以由多个线程同时持有。

  • 读锁-如果没有线程获取或请求写锁,那么多个线程可以获取读锁
  • 写锁-如果没有线程在读或写,那么只有一个线程可以获得写锁

简单的说就是ReentrantReadWriteLock可以保证最多同时有一个线程在写数据,或者可以同时有多个线程读数据。因此使用ReentrantReadWriteLock,在读操作比写操作更频繁的情况下,可以提高程序的性能和吞吐量。

下面我们用一个简单的例子,来解读一下如何应用读写锁。

public class TestReadWriteLock {
  //可以同时执行3个线程任务的线程池
  ExecutorService executor = Executors.newFixedThreadPool(3);
  //读写目标,写线程放入数据到map,读线程从map读取数据
  Map<String, String> map = new HashMap<>();
  //读写锁操作对象
  ReadWriteLock lock = new ReentrantReadWriteLock();

  //写操作函数
  public void write(){
    executor.submit(() -> { //线程池提交写操作任务
      lock.writeLock().lock(); //加写锁
      try {
        map.put("key", "val");  //写数据操作
        Thread.sleep(2000);
      } catch (InterruptedException e) {
        e.printStackTrace();
      } finally {
        lock.writeLock().unlock(); //释放写锁
      }
    });
  }

  //读操作函数
  public void read(){
    lock.readLock().lock(); //加读锁
    System.out.println(Thread.currentThread().getName() + "加读锁");
    try {
      System.out.println(map.get("key")); //读数据操作
    } finally {
      lock.readLock().unlock(); //释放读锁
      System.out.println(Thread.currentThread().getName() + "释放读锁");
    }
  }

}

三、读锁之间不互斥

我们写一个测试方法,通过打印输出来理解读写锁控制代码的执行顺序。

  //测试
  public static void main(String[] args) {
    TestReadWriteLock test = new TestReadWriteLock();
    test.write();  //提交一次写操作任务,写一条数据
    Runnable readTask = test::read;  //线程方法read,实现线程Runnable接口的简便写法
    test.executor.submit(readTask);  //读1次(新读线程)
    test.executor.submit(readTask);  //读2次 (新读线程)
    test.executor.shutdown();
  }

执行上面的代码,可能会出现下面的输出

pool-1-thread-2加读锁
pool-1-thread-3加读锁
val
val
pool-1-thread-3释放读锁
pool-1-thread-2释放读锁

在pool-1-thread-2没有释放读锁情况下,pool-1-thread-3可以再次加读锁,并且都正确的读取到数据val。说明读锁之间是不互斥的。但是,在进行读操作(读锁生效)的时候,写操作是无法进行的(无法获取写锁),所以ReentrantReadWriteLock不支持同时加读锁和写锁。 这个结论我可以负责任告诉大家,这里我就不做验证了!

到此这篇关于java并发编程中ReentrantLock可重入读写锁的文章就介绍到这了,更多相关java ReentrantLock可重入读写锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: java并发编程中ReentrantLock可重入读写锁

本文链接: https://www.lsjlt.com/news/148817.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java并发编程中ReentrantLock可重入读写锁
    目录一、ReentrantLock可重入锁二、ReentrantReadWriteLock读写锁三、读锁之间不互斥一、ReentrantLock可重入锁 可重入锁ReentrantL...
    99+
    2022-11-13
  • java高并发的ReentrantLock重入锁
    目录synchronized的局限性ReentrantLockReentrantLock基本使用ReentrantLock是可重入锁ReentrantLock实现公平锁Reentra...
    99+
    2022-11-12
  • java并发编程Lock锁可重入性与公平性分析
    目录一、相似之处:Lock锁 vs Synchronized 代码块二、Lock接口中的方法三、不同点:Lock锁 vs Synchronized 代码块四、锁的可重入性4.1. s...
    99+
    2022-11-13
  • 【漫画】JAVA并发编程 J.U.C Lock包之ReentrantLock互斥锁
    在如何解决原子性问题的最后,我们卖了个关子,互斥锁不仅仅只有synchronized关键字,还可以用什么来实现呢? J.U.C包中还提供了一个叫做Locks的包,我好歹英语过了四级,听名字我就能马上大声的说:Locks包必然也可以...
    99+
    2018-12-24
    【漫画】JAVA并发编程 J.U.C Lock包之ReentrantLock互斥锁
  • java并发编程StampedLock高性能读写锁详解
    目录一、读写锁二、悲观读锁三、乐观读一、读写锁 在我的《java并发编程》上一篇文章中为大家介绍了《ReentrantLock读写锁》,ReentrantReadWriteLock可...
    99+
    2022-11-13
  • Java并发编程ReentrantReadWriteLock加读锁流程
    目录正文属性介绍加锁成功处理正文 protected final int tryAcquireShared(int unused) { Thread current = Th...
    99+
    2023-05-19
    Java并发ReentrantReadWriteLock Java并发加读锁
  • Java并发中如何搞懂读写锁
    本篇文章为大家展示了Java并发中如何搞懂读写锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。ReentrantReadWriteLock我们来探讨一下java.concurrent.util包下的...
    99+
    2023-06-25
  • 怎么在Java中使用ReentrantLock实现并发编程
    这篇文章给大家介绍怎么在Java中使用ReentrantLock实现并发编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、首先看图二、lock()跟踪源码这里对公平锁和非公平锁做了不同实现,由构造方法参数决定是否公...
    99+
    2023-06-15
  • Go语言并发编程之互斥锁Mutex和读写锁RWMutex
    目录一、互斥锁Mutex1、Mutex介绍2、Mutex使用实例二、读写锁RWMutex1、RWMutex介绍2、RWMutex使用实例在并发编程中,多个Goroutine访问同一块...
    99+
    2022-11-12
  • 深入源码解析 ReentrantLock、AQS:掌握 Java 并发编程关键技术
    前言Lock重入锁synchronizedReentrantLock ReentrantReadWriteLock 读写锁ReentrantLock 实现原理AQSAQS 内部实现Node 内部结构Node 变更过程添加节...
    99+
    2023-08-16
    java 开发语言 数据库
  • Java 并发包中的读写锁及其实现分析
    这期内容当中小编将会给大家带来有关Java 并发包中的读写锁及其实现分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 前言在Java并发包中常用的锁(如:ReentrantLock),基本上都是排他...
    99+
    2023-06-17
  • Java并发编程中死锁的实现
    这篇文章给大家介绍Java并发编程中死锁的实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、什么是死锁所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进二、死锁产生的...
    99+
    2023-06-15
  • 如何使用Java并发编程处理文件读写?
    Java并发编程是一种处理多线程应用程序的技术,它可以有效地提高应用程序的性能和响应速度。对于需要频繁进行文件读写操作的应用程序,使用Java并发编程可以帮助我们更加高效地处理文件读写。 本文将介绍如何使用Java并发编程处理文件读写,包括...
    99+
    2023-10-17
    并发 响应 文件
  • 并发编程中如何使用Java中的锁?
    并发编程中如何使用Java中的锁? 在Java中,锁是一种用来控制多个线程访问共享资源的机制。锁可以保证在同一时刻只有一个线程可以访问共享资源,从而避免多个线程同时修改数据导致的数据不一致问题。Java中的锁可以分为两种类型:内置锁和显式锁...
    99+
    2023-08-28
    numy shell 并发
  • Java并发编程中的悲观锁和乐观锁机制
    这篇文章主要介绍“Java并发编程中的悲观锁和乐观锁机制”,在日常操作中,相信很多人在Java并发编程中的悲观锁和乐观锁机制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的悲观锁和乐观锁机制...
    99+
    2023-06-02
  • Java并发编程:如何实现高吞吐量的文件读写?
    在大型数据处理系统中,文件读写是一个必不可少的环节。然而,传统的文件读写方法在高并发、大数据量的情况下往往存在性能瓶颈,无法满足系统的需求。本文将介绍一种基于Java并发编程的文件读写方案,可以实现高吞吐量的文件读写。 使用NIO实现文...
    99+
    2023-10-17
    并发 响应 文件
  • 你知道吗?Java并发编程如何优化文件读写性能?
    Java并发编程如何优化文件读写性能? 在Java应用程序中,文件读写是非常常见的操作,而在大部分情况下,读写文件是串行的,也就是说,一个线程在读写文件时,其他线程必须等待它完成才能开始读写。这种情况下,多线程的优势就无法发挥了。为了解决这...
    99+
    2023-10-17
    并发 响应 文件
  • 深入分析java并发编程中volatile的实现原理
    引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能...
    99+
    2023-05-30
    java 并发编程 volatile
  • PHP并发编程中,如何有效处理文件和日志的读写操作?
    在PHP并发编程中,文件和日志的读写操作是非常常见的。然而,它们的处理方式会对系统性能产生很大的影响。本文将介绍如何在PHP并发编程中有效处理文件和日志的读写操作。 文件读写 在PHP中,文件读写是通过文件指针来实现的。我们可以使用fop...
    99+
    2023-06-09
    并发 文件 日志
  • 面试中Linux环境下Java并发编程的重要性与技巧。
    在当今互联网技术的快速发展中,Java作为一种广泛使用的编程语言,其并发编程能力也日益受到重视。在Linux环境下进行Java并发编程,可以充分利用Linux系统的多线程、多进程等优势,提高程序的运行效率和并发处理能力。本文将从Java并发...
    99+
    2023-06-24
    linux 面试 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作