【并發編程篇】讀鎖readLock()和寫鎖writeLock()

文章目錄

  • 🛸情景引入
    • ?解決問題

在這里插入圖片描述
readLock()和writeLock()都是ReadWriteLock接口中定義的方法,用于獲取讀鎖和寫鎖。

readLock()方法返回一個讀鎖,允許多個線程同時獲取該鎖,以進行并發讀取操作。如果當前已有一個寫鎖或其他線程正在請求寫鎖,則讀鎖會被阻塞,直到所有寫鎖請求完成并釋放鎖為止。讀鎖和寫鎖之間是互斥的。

writeLock()方法返回一個寫鎖,只允許一個線程獲取該鎖,以進行寫入操作。如果當前已有一個讀鎖或其他線程正在請求讀鎖,則寫鎖會被阻塞,直到所有讀鎖請求完成并釋放鎖為止。寫鎖是獨占的,同一時間只能有一個線程持有寫鎖。

在使用讀寫鎖時,應該根據具體的業務場景和需求選擇適當的鎖類型。如果共享資源的讀取操作遠遠超過寫入操作,那么使用讀寫鎖可以提高系統的并發性能。如果寫入操作非常頻繁,那么使用讀寫鎖可能會導致讀取操作的性能下降,因為讀取線程需要等待寫入線程釋放寫鎖。此外,讀寫鎖也需要消耗額外的系統資源,因此應該避免不必要的鎖競爭。

🛸情景引入

我們先看下面這段代碼
在這里插入圖片描述

本來應該是1寫入,然后1寫入完全
但是現在1寫入后,緊跟著的是3寫入
這明顯是錯誤的

?解決問題

下面我們來加上鎖,解決問題

package org.Test6;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockDemo {public static void main(String[] args) {MyCacheLock myCache = new MyCacheLock();//寫入for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.put(temp+"",temp+"");},String.valueOf(i)).start();}//讀取for(int i=1;i<=5;i++){final int temp=i;new Thread(()->{myCache.get(temp+"");},String.valueOf(i)).start();}}
}//自定義緩存
class MyCacheLock{private volatile Map<String,Object> map = new HashMap<>();private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();//存 寫 寫入的時候// 只希望只有一個線程去寫public void put(String key,Object value){readWriteLock.writeLock().lock();  //加鎖try {System.out.println(Thread.currentThread().getName()+"寫入"+key);map.put("key","value");System.out.println(Thread.currentThread().getName()+"寫入結束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.writeLock().unlock();  //解鎖}}//取 讀//讀的時候,所有人都可以讀public void get(String key){readWriteLock.readLock().lock(); //加鎖try {System.out.println(Thread.currentThread().getName()+"讀取"+key);Object o=map.get("key");System.out.println(Thread.currentThread().getName()+"讀取結束");} catch (Exception e) {e.printStackTrace();}finally {readWriteLock.readLock().unlock(); //解鎖}}
}

在這里插入圖片描述

這段代碼中,讀操作和寫操作的主要區別在于使用的鎖不同,讀操作使用ReadWriteLock實例中的readLock()獲取讀鎖,而寫操作使用writeLock()獲取寫鎖。
讀寫鎖允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。因此,在讀操作中,多個線程可以同時獲得讀鎖并讀取共享資源,而寫操作需要獲取排他的寫鎖,以防止其他線程同時寫入共享資源。
在MyCacheLock中,put()方法使用writeLock()獲取寫鎖,以確保只有一個線程在寫入數據時修改共享資源,而get()方法使用readLock()獲取讀鎖,允許多個線程同時讀取數據。
這種讀寫鎖的機制可以提高并發性能,因為允許多個線程同時讀取共享資源,而不會產生數據沖突,同時通過只允許一個線程寫入共享資源,可以避免寫操作的數據競爭和不一致性。

獨占鎖(寫鎖):一次只能被一個線程占有
共享鎖(讀鎖):多個線程可以同時占有

在技術的道路上,我們不斷探索、不斷前行,不斷面對挑戰、不斷突破自我。科技的發展改變著世界,而我們作為技術人員,也在這個過程中書寫著自己的篇章。讓我們攜手并進,共同努力,開創美好的未來!愿我們在科技的征途上不斷奮進,創造出更加美好、更加智能的明天!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536659.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536659.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536659.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GIT具體配置步驟詳解

GIT配置具體步驟如下 SDK 使用 Repo 工具管理&#xff0c;拉取 SDK 需要配置安裝 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workf…

裝飾器模式和責任鏈模式區別

近期看了 mybatis 的源碼&#xff0c;發現二級緩存這塊用了裝飾器模式將各個功能的緩存進行嵌套&#xff0c;源碼上也是講到使用了裝飾器模式&#xff0c;但是看著跟責任鏈模式類似&#xff0c;本著搞清楚的想法&#xff0c;搜了很多資料&#xff0c;看了書籍《Head First 設計…

AI行業新趨勢:百模大戰中的變革與未來

AI行業新趨勢&#xff1a;百模大戰中的變革與未來 人工智能&#xff0c;這個曾經被視為科幻小說的情節&#xff0c;如今已經成為我們生活中的常態。從智能手機、自動駕駛汽車&#xff0c;到智能家居、醫療診斷&#xff0c;AI的應用已經深入到我們生活的各個角落。然而&#xf…

多維時序 | MATLAB實CNN-BiGRU-Mutilhead-Attention卷積網絡結合雙向門控循環單元網絡融合多頭注意力機制多變量時間序列預測

多維時序 | MATLAB實現CNN-BiGRU-Mutilhead-Attention卷積網絡結合雙向門控循環單元網絡融合多頭注意力機制多變量時間序列預測 目錄 多維時序 | MATLAB實現CNN-BiGRU-Mutilhead-Attention卷積網絡結合雙向門控循環單元網絡融合多頭注意力機制多變量時間序列預測預測效果基本介…

ubuntu 22.04 安裝mysql服務

完整內容&#xff1a; https://developer.aliyun.com/article/1260321 # 安裝服務 sudo apt install mysql-server# 按向導設置root密碼 sudo mysql_secure_installation# 使用設置的密碼登錄 sudo mysql -u root -p也可以使用工具登錄&#xff0c;例如: navicat for mysql

協同工作php,PHPOA:靈活、高效、協同,讓企業高效運轉

原標題&#xff1a;PHPOA&#xff1a;靈活、高效、協同&#xff0c;讓企業高效運轉PHPOA系統作為一個管理系統&#xff0c;它的職責就是為企業高效運轉而服務&#xff0c;以提高企業的辦公效率為己任&#xff0c;減少不必要的資源浪費為責任。它保持高度的靈活性、高效性與協同…

ubuntu搭建php開發環境記錄

2019獨角獸企業重金招聘Python工程師標準>>> 這兩天自己在阿里云上面買了一個ecs&#xff0c;系統選的是ubuntu16.04&#xff0c;第一件事就是先搭環境&#xff0c;這次準備使用lamp組合。 Apache安裝 首先安裝apache服務器&#xff0c;ubuntu下面使用apt-get來下載…

php datediff 函數,dateAdd與DateDiff函數的js代碼

1、DateAdd函數&#xff1a;復制代碼 代碼示例:function DateAdd(interval,number,date){switch(interval.toLowerCase()){case "y": return new Date(date.setFullYear(date.getFullYear()number));case "m": return new Date(date.setMonth(date.getMont…

mysql索引為啥要選擇B+樹 (下)

有讀者在 mysql索引為啥要選擇B樹 (上) 上篇文章中留言總結了選擇 B 樹的原因&#xff0c;大體上說對了&#xff0c;今天我們再一起來看看具體的原因。 索引為什么要保存在硬盤中首先要明白幾個概念&#xff0c;服務器存儲一般分內存和硬盤&#xff0c;內存的大小相對于硬盤來說…

des加解密java c#,C#編寫DES加密、解密類

這個C#類封裝的DES加密解密&#xff0c;可以使用默認秘鑰進行加密、解密&#xff0c;也可以自定義秘鑰進行加密、解密&#xff0c;調用簡單方便。示例一&#xff1a;using System;using System.Security.Cryptography;using System.Text;namespace DotNet.Utilities{/// /// DE…

八年開發程序員淺析SpringBoot 之 Shiro 與 Redis 多級緩存問題

前言 來自不愿意透露姓名的小師弟的投稿。這篇主要講了&#xff0c;項目中配置了多緩存遇到的坑&#xff0c;以及解決辦法。 發現問題 在一次項目實踐中有實現多級緩存其中有已經包括了 Shiro 的 Cache &#xff0c;本以為開啟 redis 的緩存是一件很簡單的事情只需要在啟動類上…

Web端H.265播放器研發解密

音視頻編解碼對于前端工程師是一個比較少涉足的領域&#xff0c;涉及到流媒體技術中的文本、圖形、圖像、音頻和視頻多種理論知識的學習&#xff0c;才能夠應用到具體實踐中&#xff0c;本團隊在多媒體領域深耕兩年多&#xff0c;才算是有一定產出&#xff0c;我們自研web播放器…

拳擊 武術java父類,拳擊是一種很有力量的武術類型

原標題&#xff1a;拳擊是一種很有力量的武術類型拳擊是一種很有力量的武術類型&#xff0c;拳擊比賽策略有很多&#xff0c;圍繩技術是其中之一。那么拳擊比賽策略技巧有哪些呢&#xff1f;下面養生之道網為您解析拳擊比賽策略技巧有哪些&#xff0c;看看吧。1、當拳手靠在圍繩…

捧上天的AI落地困難,“ 不懂變通”的華為云如何應付?

前幾年&#xff0c;AI幾乎被捧上天&#xff0c;各大公司傾巢出動&#xff0c;推出了不少吸眼球的應用和產品。如今&#xff0c;這些AI成果是否真得讓企業從中獲得價值&#xff1f;繞不開的數據、隱私和安全問題作何解&#xff1f;不同領域、不同規模、不同技術能力的企業如何最…

Apache-Flink深度解析-DataStream-Connectors之Kafka

Kafka 簡介Apache Kafka是一個分布式發布-訂閱消息傳遞系統。 它最初由LinkedIn公司開發&#xff0c;LinkedIn于2010年貢獻給了Apache基金會并成為頂級開源項目。Kafka用于構建實時數據管道和流式應用程序。它具有水平擴展性、容錯性、極快的速度&#xff0c;目前也得到了廣泛的…

Java使用繼承的語法是,Java基礎語法八 繼承

1、超類和子類超類和子類父類與子類多態&#xff1a;一個對象變量可以指示多種實際類型的現象稱為多態一個變量可以引用父類對象&#xff0c;也可以引用其子類對象&#xff0c;這就是多態。不能將一個超類的引用賦給子類變量&#xff0c;因為調用子類方法時可能發生運行錯誤子類…

kaka 1.0.0 重磅發布,服務于后端的事件領域模型框架。

百度智能云 云生態狂歡季 熱門云產品1折起>>> kaka 1.0.0正式發布了&#xff0c;從三個月前的kaka-notice-lib 1.0.0的發布&#xff0c;經過多次研磨&#xff0c;終于迎來了本次重大更新。 kaka是一款服務于java后端的事件領域模型框架&#xff0c;主要目的為解耦業…

java配置文件工具類,java項目加載配置文件的工具類

java項目加載配置文件的工具類package com.loadproperties;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class ConfigUtil {private static InputStream input;private volatile Properties configuration new Properties();/…

如何把WAV格式音頻轉換為MP3格式

WAV為微軟公司&#xff08;Microsoft)開發的一種聲音文件格式&#xff0c;它符合RIFF(Resource Interchange File Format)文件規范&#xff0c;用于保存Windows平臺的音頻信息資源&#xff0c;被Windows平臺及其應用程序所廣泛支持&#xff0c;因此在聲音文件質量和CD相差無幾&…

php 異步處理類,php異步處理類

該類可以請求HTTP和HTTPS協議&#xff0c;還可以處理301、302重定向以及GZIP壓縮等。[PHP]代碼//使用方法require(asynHandle.class.php);$obj new asynHandle();$result $obj->Request(http://baidu.com);$result2 $obj->Get(https://mail.google.com/);echo "{…