異步與并行~ReaderWriterLockSlim實現的共享鎖和互斥鎖

返回目錄

在System.Threading.Tasks命名空間下,使用ReaderWriterLockSlim對象來實現多線程并發時的鎖管理,它比lock來說,性能更好,也并合理,我們都知道lock可以對代碼塊進行鎖定,當多線程共同訪問代碼時,只能有一個線程去訪問它,其它線程被阻塞,這對于寫操作是必須的,但對于讀操作來說,就有些浪費資源了,因為我們的讀操作應該是共享的,多個線程可以現時去讀它,這就引出了ReaderWriterLockSlim對象,用它來實現共享鎖和互斥鎖!

聲明一個讀寫鎖

 private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

EnterReadLock和ExitReadLock-共享鎖

當一個線程使用共享鎖時,其它線程同樣了可以訪問這個資源,共用這個鎖對象

  rwLock.EnterReadLock();Console.WriteLine(DateTime.Now.ToLongTimeString() + "線程{0}讀到了數據", Thread.CurrentThread.ManagedThreadId);Thread.Sleep(10000);rwLock.ExitReadLock();

EnterWriteLock和ExitWriteLock-互斥鎖

當一個線程使用互斥鎖時,其它線程將被阻塞,直到這個線程釋放鎖(ExitWriteLock)為止

  rwLock.EnterWriteLock();Console.WriteLine(DateTime.Now.ToLongTimeString() + "線程{0}寫了數據{1}", Thread.CurrentThread.ManagedThreadId, res);Thread.Sleep(10000);rwLock.ExitWriteLock();

我們在測試時,可以模式多個并發的線程,去調用同一個加鎖的代碼,然后看一個它們執行的時間即可

       //多線程的并行Parallel.Invoke(() =>{TestReadWrite("1");}, () =>{TestReadWrite("2");}, () =>{TestReadWrite("3");});

執行的結果

我們可以看到,共享鎖在被訪問時,幾個線程是同時的;而互斥鎖在使用時,則出現了線程之間的等待(阻塞)!

感謝各位的閱讀!

返回目錄

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

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

相關文章

linux ssh yum升級_Linux 運維必備的 13 款實用工具,拿好了

作者丨Erstickthttp://blog.51cto.com/13740508/2114819本文介紹幾款 Linux 運維比較實用的工具,希望對 Linux 運維人員有所幫助。1. 查看進程占用帶寬情況 - NethogsNethogs 是一個終端下的網絡流量監控工具可以直觀的顯示每個進程占用的帶寬。下載:htt…

iOS應用如何支持IPV6

本文轉自 http://www.code4app.com/forum.php?modviewthread&tid8427&highlightipv6 果然是蘋果打個哈欠,iOS行業內就得起一次風暴呀。自從5月初Apple明文規定所有開發者在6月1號以后提交新版本需要支持IPV6-Only的網絡,大家便開始熱火朝天的研…

SQL Server -- SQLserver 存儲過程執行錯誤記錄到表

SQLserver 存儲過程執行錯誤記錄到表 From: http://blog.csdn.net/leshami/article/details/51333650 對于在執行存儲過程中碰到的一些錯誤,如果未及時捕獲或者說傳遞給前端應用程序來,在這樣的情形下,故障的排查顯得尤為困難。基于此&…

opencv python教程簡書_OpenCV-Python系列二:常用的圖像屬性

對于圖像,我們經常需要知道關于圖像的特殊屬性,比如寬度,高度,面積,像素點數目等等,那么在opencv-python中,這些信息如何獲取呢? 本文結構: 1.基本圖像屬性 2. 對于openc…

C++靜態成員函數指針

C的靜態成員函數指針 先簡單的說說非靜態的成員函數。 非靜態成員函數指針的類型: 類的非靜態成員是和類的對象相關的。也就是說,要通過類的對象來訪問變量。 成員函數的類型定義為: typedef void (A::*pfunc)(); A是一個類,有一個成員函數…

Windows下C語言連接Oracle數據庫

為什么80%的碼農都做不了架構師?>>> 最近公司有個項目需要用到Oracle數據庫,我負責前期的調研。由于項目要用到C和PHP兩種語言,所以先收集這兩種語言連接Oracle的方法。PHP使用的是Laravel框架,直接使用了Laravel-OCI…

SU suspecfk命令學習

用suplane生成平面,并查看其FK譜, 水平反射界面經FK變換后,波數為0, 正好處于臨界,乃奎斯特頻率, 有空間假頻, Over,不足之處,歡迎批評指正。 轉載于:https://www.cnblog…

dblink查詢_分庫數據如何查詢統計

分庫后的計算不能直接使用SQL;異構庫 SQL 函數不盡相同;JAVA 硬編碼實施難度大;即使借助透明網關訪問遠程數據庫,分庫性能優化也是頭疼問題。一般常規辦法:方法1:java硬編碼簡單的跨庫count運算&#xff0c…

python 爬取大樂透開獎結果

#codingutf-8 #下面中文注釋不支持 所以開頭加 "#codingutf-8" # 獲取近期大樂透開獎結果, 并給出自己猜中的個數import requests# 這個API能夠免費得到近期開獎結果, url里的-20代表獲取近20期的開獎信息 url "http://f.apiplus.net/dlt-20.json" re…

【Python五篇慢慢彈(5)】類的繼承案例解析,python相關知識延伸

類的繼承案例解析&#xff0c;python相關知識延伸 作者&#xff1a;白寧超 2016年10月10日22:36:57 摘要&#xff1a;繼<快速上手學python>一文之后&#xff0c;筆者又將python官方文檔認真學習下。官方給出的pythondoc入門資料包含了基本要點。本文是對文檔常用核心要點…

課堂練習之小強大掃蕩

標題&#xff1a;在將程序安裝到新的手機上時會出現程序崩潰 解決&#xff1a;1、找出錯誤&#xff1a;經過一系列測試&#xff0c;發現問題出現在第一次訪問數據庫的代碼時報錯。錯誤原因為不能發現數據庫中的建立的表。 2、如何解決&#xff1a;在主頁面加入訪問數據庫語句。…

領域驅動設計:軟件核心復雜性應對之道_人人都可以領域驅動設計(一)

最近幾年&#xff0c;領域驅動設計&#xff08;Domain-Driven Design&#xff0c;DDD&#xff09;這個術語越來越多地出現在軟件工程師的視野里。對DDD不熟悉的人可能會覺得它是軟件領域里的一個新的概念&#xff0c;但是實際上&#xff0c;Eric Evans在十幾年前就已經提出了這…

linux 進程通信 消息隊列

詳解linux進程間通信-消息隊列 前言&#xff1a;前面討論了信號、管道的進程間通信方式&#xff0c;接下來將討論消息隊列。 一、系統V IPC 三種系統V IPC&#xff1a;消息隊列、信號量以及共享內存&#xff08;共享存儲器&#xff09;之間有很多相似之處。 每個內核中的 I P …

laravel框架——composer導入laravel

第一種&#xff1a;  composer create-project --prefer-dist laravel/laravel projectName "5.2.*"第二種&#xff1a;  composer global require "laravel/installer"  laravel new 名稱轉載于:https://www.cnblogs.com/xj76149095/p/5951822.html…

第七章 心得體會

通過第七章的學習&#xff0c;使自己對驅動程序的認識更加深刻&#xff0c;LED燈的驅動程序幫我我學到很多&#xff0c;還學會了驅動的移植。 學到的知識&#xff1a; 一、編寫LED驅動 1、創建LED驅動的設備文件 第一步&#xff1a;使用cdev_init函數初始化cdev leds_cdev.owne…

wx.checkjsapi是寫在config里面嗎_用Python寫一個程序,解密游戲內抽獎的秘密

前言本文的文字及圖片來源于網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。作者&#xff1a; 極客挖掘機PS&#xff1a;如有需要Python學習資料的小伙伴可以加點擊下方鏈接自行獲取http://t.cn/A6Zvjdun分析需求我們先整理下思…

Dev C++安裝第三方庫boost

Dev_C安裝第三方庫boost 安裝步驟 準備工作下載boost庫&#xff0c;下載地址https://sourceforge.net/projects/boost/1. 設置GCC的環境變量PATH 設置環境變量path,在其中加上DEV-C編譯器的路徑&#xff08;gcc.exe所在路徑&#xff09;&#xff0c;如C:\Program Files (x86)…

bash的一些小技巧

1、從輸入讀入變量 eg:read -ep "input yes or no: " flag 用e選項表示編輯&#xff0c;可以使用backspace刪除 2、數組 a、索引數組 declare -a arr(var1 var2 var3) 用空格分割&#xff0c;如果直接訪問變量$arr&#xff0c; 則獲取的是數組的第一個元素&#xff0…

golang switch_為什么程序員都不喜歡使用 switch ,而是大量的 if……else if ?

點擊上方“我要學編程”&#xff0c;選擇“置頂/星標公眾號”福利干貨&#xff0c;第一時間送達&#xff01;來自 | C語言Plus請用5秒鐘的時間查看下面的代碼是否存在bug。OK&#xff0c;熟練的程序猿應該已經發現Bug所在了&#xff0c;在第13行下面我沒有添加關鍵字break; 這就…

RabbitMQ 安裝與簡單使用

在企業應用系統領域&#xff0c;會面對不同系統之間的通信、集成與整合&#xff0c;尤其當面臨異構系統時&#xff0c;這種分布式的調用與通信變得越發重要。其次&#xff0c;系統中一般會有很多對實時性要求不高的但是執行起來比較較耗時的地方&#xff0c;比如發送短信&#…