【转】-java多线程读写锁ReadWriteLock

Java多线程中读写锁ReadWriteLock的使用

该博客转载自​**lavimerJava多线程中读写锁ReadWriteLock的使用**

1. 概念

读写锁分为读锁和写锁,多个读锁之间是不需要互斥的(读操作不会改变数据,如果上了锁,反而会影响效率),写锁和写锁之间需要互斥,也就是说,如果只是读数据,就可以多个线程同时读,但是如果你要写数据,就必须互斥,使得同一时刻只有一个线程在操作。

2. 案例

2.1 三线程读数据,三线程写数据
package com.tao.leanrn.thread.lock;import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** @ClassName ReadWrite* @Descriiption 读写锁* @Author yanjiantao* @Date 2019/8/21 10:42**/
public class ReadWrite {/*** 共享数据*/private int data = 0;/*** 读写锁*/private ReadWriteLock lock = new ReentrantReadWriteLock();public void get() {// 上读锁lock.readLock().lock();try {System.out.println(Thread.currentThread().getName() + "----->读锁开始执行...");Thread.sleep((long)(Math.random() * 10));System.out.println(Thread.currentThread().getName() + "----->读锁得到数据data=" + data);} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁lock.readLock().unlock();}}public void set() {// 上写锁lock.writeLock().lock();try {System.out.println(Thread.currentThread().getName() + "----->写锁开始执行...");Thread.sleep((long)(Math.random() * 10));data++;System.out.println(Thread.currentThread().getName() + "----->写锁得到数据data=" + data);} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放写锁lock.writeLock().unlock();}}
}/*** 测试类*/
class Main{public static void main(String[] args) {ReadWrite readWrite = new ReadWrite();// 创建100个读写线程for (int i = 0; i < 100; i++) {new Thread(() -> {readWrite.get();}).start();new Thread(() -> {readWrite.set();}).start();}}}

程序运行结果

1706261828185.png

2.2 模拟Hibernate缓存
public class HibernateCache {/* 定义一个Map来模拟缓存 */private Map<String, Object> cache = new HashMap<String, Object>();/* 创建一个读写锁 */private ReadWriteLock rwLock = new ReentrantReadWriteLock();/*** 模拟Hibernate缓存* @param key* @return*/private Object getData(String key) {/* 上读锁 */rwLock.readLock().lock();/* 定义从缓存中读取的对象 */Object value = null;try {/* 从缓存中读取数据 */value = cache.get(key);if (value == null) {/* 如果缓存中没有数据,我们就把读锁关闭,直接上写锁【让一个线程去数据库中取数据】 */rwLock.readLock().unlock();/* 上写锁 */rwLock.writeLock().lock();try {/* 上了写锁之后再判断一次【我们只让一个线程去数据库中取值即可,当第二个线程过来的时候,发现value不为空了就去缓存中取值】 */if (value == null) {/* 模拟去数据库中取值 */value = "hello";}} finally {/* 写完之后把写锁关闭 */rwLock.writeLock().unlock();}/* 缓存中已经有了数据,我们再把已经 关闭的读锁打开 */rwLock.readLock().lock();}} finally {/* 最后把读锁也关闭 */rwLock.readLock().unlock();}return value;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV】BGR三色通道的提取与合并--超详细解读

在OpenCV中&#xff0c;处理图像时经常需要提取或合并图像的RGB&#xff08;红、绿、蓝&#xff09;三色通道。OpenCV默认使用BGR&#xff08;蓝、绿、红&#xff09;顺序来存储图像的颜色通道&#xff0c;这一点与很多图像处理库&#xff08;如PIL/Pillow&#xff09;不同&…

Android Constant expression required (case R.id.xxx)

gradle更新到8.0后&#xff0c;遇到了这个报错 有两种解决方式&#xff1a; 1、在gradle.properties中添加下面代码 android.nonFinalResIdsfalse 2、使用if-else来判断 int id view.getId(); if (id R.id.setting_iv_back) {} else if (id R.id.setting_tv_clear) {}

Web知识库应用程序LibreKB

什么是 LibreKB &#xff1f; LibreKB 是一款知识库 Web 应用程序。免费、开源、自托管&#xff0c;基于 PHP/MySQL。 官方并没有 Docker 镜像&#xff0c;老苏这次图省事&#xff0c;并没有像往常一样构建一个镜像&#xff0c;而是基于 Docker 搭建了一个 LAMP 环境&#xff0…

蹭一个围棋亚军!不要和低维的人说话——早读(逆天打工人爬取热门微信文章解读)

熬夜后需要补什么呢&#xff1f; 引言Python 代码第一篇 洞见 不要和低维的人说话&#xff08;深度好文&#xff09;第二篇 冲冲冲结尾 引言 昨晚真的是熬夜又想不出东西 真的头大 最近下围棋 这个棋感很好呀 我是K级选手 目前是8级 套几个buff 纯自学 为什么决定学围棋呢? 是…

谷粒商城配置中心错误记录

文章目录 一&#xff0c;com.alibaba.nacos.api.exception.NacosException: endpoint is blank1&#xff0c;分析定位2&#xff0c;关于配置文件application和bootstrap的区别与练习加载顺序使用说明 参考文献 一&#xff0c;com.alibaba.nacos.api.exception.NacosException: …

Navicat Premium 15 for Mac/Win 中文安装包下载

Navicat Premium 15 是一款数据库管理工具&#xff0c;它支持多种类型的数据库&#xff0c;包括 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite。该软件提供了一个用户友好的图形界面&#xff0c;使得数据库的管理变得更加简单和高效。Navicat Premium 1…

网页视频提取在线工具

在互联网的海洋中&#xff0c;我们时常会遇到一些令人心动的视频&#xff0c;想要将其下载到本地&#xff0c;以便随时观看。然而&#xff0c;网页视频下载对于很多人来说&#xff0c;似乎是个复杂的过程。别担心&#xff0c;今天我就为大家带来一份详尽的网页视频下载教程&…

24小时悬停系留照明无人机技术详解

24小时悬停系留照明无人机是一款专门设计用于提供长时间、高效能照明服务的无人机系统。该系统结合了无人机技术与先进的照明设备&#xff0c;通过系留技术实现无人机的稳定悬停&#xff0c;从而提供连续不断的照明服务。该无人机能够在各种环境条件下进行24小时不间断工作&…

Zkeys三方登录模块支持QQ、支付宝登录

1&#xff0c;覆盖到根目录&#xff0c;并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理&#xff0c;配置管理员权限-系统类别-找到云外科技&#xff0c;全部打勾 3&#xff0c;后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…

docker 安装教程

机缘 最近在开发用用到了docker,主要是将开发的项目发版到平台上&#xff0c;运用到docker发版&#xff0c;所以才会写这篇文章。 教程 1、安装Hype-v。 在安装之前&#xff0c;首先要检查下电脑系统是否安装Hyper-v功能。 注意&#xff1a;一定要检查电脑系统&#xff0c;…

多会话 Telnet 日志记录器

创建一个多会话 Telnet 日志记录器可以实现对多个 Telnet 会话进行连接、监控和记录日志。以下是一个基本的 Python 示例&#xff0c;使用 telnetlib 库来实现多会话 Telnet 日志记录器&#xff0c;并使用 threading 模块来处理多个会话。 1、问题背景 我们需要编写一个脚本&a…

Сетунь的24条单播指令

1、Setun模拟器概述 真的&#xff0c;想搞懂一台电脑是怎么运行的&#xff0c;那就搞懂它的指今集是怎么跑的&#xff0c;感觉很离了个大谱的&#xff0c;先看由铁氧体磁芯上的器件组成的RAM&#xff0c;容量为162个9-trit单元&#xff0c;即每个单元为9-trit&#xff0c;每页有…

【uni-app+Vue3】 API请求封装:让接口调用更便捷

前言&#xff1a;uni-app是一款基于Vue.js框架的跨平台开发工具&#xff0c;可以将代码编译成H5、小程序、App等不同平台的应用。在进行uni-app开发时&#xff0c;网络请求是必不可少的环节。为了方便开发&#xff0c;我们可以封装一些网络请求方法&#xff0c;以便在多个页面中…

About CAT7验证——CLASS F或者Fa测试FLUKE解决方案

七类CLASS F线缆认证测试标准在TIA的标准数据库中是直接跳过&#xff0c;取而代之的是八类的通道测试标准&#xff0c;真正认证七类测试的是在ISO标准数据库中&#xff0c;找到ISO11801 CHANNEL CLASS F或者FA&#xff0c;这就是标准的七类测试标准&#xff0c;测试频率需要达到…

一些学习网站分享

一些学习网站分享&#xff1a; ✅力扣(LeetCode) 力扣 (LeetCode) 官网 - 全球极客挚爱的技术成长平台 力扣是一个刷题站&#xff0c;支持C&#xff0c;Java&#xff0c;Python等多种编程语言&#xff0c;并按难度分为简单、中等、困难三个等级。是真的能刷到大厂真题 ✅Gith…

文本引导I2I迈向统一!北大王选所提出FCDiffusion:端到端适用于各种图像转换任务

文章链接&#xff1a;https://arxiv.org/pdf/2407.03006 github地址&#xff1a;https://github.com/XiangGao1102/FCDiffusion 最近&#xff0c;大规模的文本到图像(T2I)扩散模型在图像到图像(I2I)转换中展现出强大的能力&#xff0c;允许通过用户提供的文本提示进行开放域的图…

智能汽车网络安全笔记

汽车五大域 动力底盘、车身控制、智能座舱、智能网联和高级辅助驾驶五大域 国外汽车安全法规标准 汽车网络安全管理体系&#xff08;CSMS&#xff09; CSMS指的是管理汽车的网络威胁和风险&#xff0c;并保护车辆免受网络攻击的组织过程和管理系统 安全验证和安全测试 8…

使用Vue实现前后端分离 spring框架返回json数据中文乱码

SpringBoot返回的中文显示???的问题_spring boot response 中文????-CSDN博客 引入js的script标签到底是放在head还是body中_html页面中用<script>标签引入js代码,该标签放在<head>标签中和放在<body>标签-CSDN博客 vue.js 的问答 - SegmentFault 思…

ChatTTS使用

ChatTTS是一款适用于日常对话的生成式语音模型。 克隆仓库 git clone https://github.com/2noise/ChatTTS cd ChatTTS 使用 conda 安装 conda create -n chattts conda activate chattts pip install -r requirements.txt 安装完成后运行 下载模型并运行 python exampl…

java中方法的使用

方法的使用 方法的概念什么是方法方法定义方法的调用过程实参和形参的关系 方法重载为什么需要方法重载方法重载的概念方法签名 递归递归的概念递归过程分析递归练习 方法的概念 什么是方法 方法就是一个代码片段&#xff0c;类似于C语言的函数。 方法存在的意义&#xff1a;…