概述

ReaderWriterLockSlim 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问;

常用的方法:

  1. cacheLock.EnterReadLock();//加上读取锁
  2.  
  3. cacheLock.ExitReadLock();//退出读取锁
  1. cacheLock.EnterWriteLock()//加上写入锁;
  1. cacheLock.ExitWriteLock();//退出写入锁
  1. cacheLock.TryEnterWriteLock(timeout);//加上超时锁
  1. cacheLock.EnterUpgradeableReadLock();尝试进入可升级模式锁定状态。
  1. cacheLock.ExitUpgradeableReadLock();尝试进入可升级模式锁定状态。
  1. MSDNDEMO如下:
  1. using System;
  2. using System.Threading;
  3. using System.Collections.Generic;
  4.  
  5. public class SynchronizedCache
  6. {
  7. private ReaderWriterLockSlim cacheLock = new ReaderWriterLockSlim();
  8. private Dictionary<int, string> innerCache = new Dictionary<int, string>();
  9.  
  10. public string Read(int key)
  11. {
  12. cacheLock.EnterReadLock();
  13. try
  14. {
  15. return innerCache[key];
  16. }
  17. finally
  18. {
  19. cacheLock.ExitReadLock();
  20. }
  21. }
  22.  
  23. public void Add(int key, string value)
  24. {
  25. cacheLock.EnterWriteLock();
  26. try
  27. {
  28. innerCache.Add(key, value);
  29. }
  30. finally
  31. {
  32. cacheLock.ExitWriteLock();
  33. }
  34. }
  35.  
  36. public bool AddWithTimeout(int key, string value, int timeout)
  37. {
  38. if (cacheLock.TryEnterWriteLock(timeout))
  39. {
  40. try
  41. {
  42. innerCache.Add(key, value);
  43. }
  44. finally
  45. {
  46. cacheLock.ExitWriteLock();
  47. }
  48. return true;
  49. }
  50. else
  51. {
  52. return false;
  53. }
  54. }
  55.  
  56. public AddOrUpdateStatus AddOrUpdate(int key, string value)
  57. {
  58. cacheLock.EnterUpgradeableReadLock();
  59. try
  60. {
  61. string result = null;
  62. if (innerCache.TryGetValue(key, out result))
  63. {
  64. if (result == value)
  65. {
  66. return AddOrUpdateStatus.Unchanged;
  67. }
  68. else
  69. {
  70. cacheLock.EnterWriteLock();
  71. try
  72. {
  73. innerCache[key] = value;
  74. }
  75. finally
  76. {
  77. cacheLock.ExitWriteLock();
  78. }
  79. return AddOrUpdateStatus.Updated;
  80. }
  81. }
  82. else
  83. {
  84. cacheLock.EnterWriteLock();
  85. try
  86. {
  87. innerCache.Add(key, value);
  88. }
  89. finally
  90. {
  91. cacheLock.ExitWriteLock();
  92. }
  93. return AddOrUpdateStatus.Added;
  94. }
  95. }
  96. finally
  97. {
  98. cacheLock.ExitUpgradeableReadLock();
  99. }
  100. }
  101.  
  102. public void Delete(int key)
  103. {
  104. cacheLock.EnterWriteLock();
  105. try
  106. {
  107. innerCache.Remove(key);
  108. }
  109. finally
  110. {
  111. cacheLock.ExitWriteLock();
  112. }
  113. }
  114.  
  115. public enum AddOrUpdateStatus
  116. {
  117. Added,
  118. Updated,
  119. Unchanged
  120. };
  121. }

锁ReaderWriterLockSlim介绍的更多相关文章

  1. oracle 锁的介绍 (转)

    本文转自:http://blog.csdn.net/gyb2013/article/details/6929697 一.什么是锁: Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行 ...

  2. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  3. redis锁机制介绍与实例

    转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...

  4. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等,在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类 ...

  5. java中的各种锁详细介绍

    转自:https://blog.csdn.net/axiaoboge/article/details/84335452 Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高 ...

  6. Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…

    Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...

  7. Java中15种锁的介绍

    作者:搜云库技术团队 原文:https://segmentfault.com/a/1190000017766364 1. Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观 ...

  8. AQS学习(一)自旋锁原理介绍(为什么AQS底层使用自旋锁队列?)

    1.什么是自旋锁? 自旋锁作为锁的一种,和互斥锁一样也是为了在并发环境下保护共享资源的一种锁机制.在任意时刻,只有一个执行单元能够获得锁. 互斥锁通常利用操作系统提供的线程阻塞/唤醒机制实现,在争用锁 ...

  9. 自己动手写把”锁”---LockSupport介绍

    本篇是<自己动手写把"锁">系列技术铺垫的最后一个知识点.本篇主要讲解LockSupport工具类,它用来实现线程的挂起和唤醒. LockSupport是Java6引入 ...

随机推荐

  1. supervisor的配置

    看了下文档,比较多.http://www.supervisord.org/ 抱着试试又不会怀孕的心态,trying,碰了几鼻子灰,记录如下, 方便大家 1. 安装 easy_install super ...

  2. JAVA8 十大新特性详解

    前言: Java8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...

  3. [转]Unchecked Exception 和 Checked Exception 比较

    Throwable类是所有异常的始祖,它有两个直接子类Error / Exception:   Error仅在Java虚拟机中发生动态连接失败或其它的定位失败的时候抛出一个Error对象.一般程序不用 ...

  4. centos7.0改变用户创建目录组权限

    centos7.0改变用户创建目录组权限可通过umask进行设置. 临时改变可通过umask命令进行设置 永久性改变,可通过修改~/.bash_profile的方式进行调整.

  5. 基于bshare分享平台,在一个页面上实现多个不同内容的web分享

    <!--引入bshare SDK--><script type="text/javascript" charset="utf-8" src=& ...

  6. [转载]Linux命令笔记

    *以下内容均来自于网络转载,感谢原作者分享 <对Linux新手非常有用的20个命令> 传送门 英文原文为“Switching From Windows to Nix or a Newbie ...

  7. 【leetcode】Reverse Nodes in k-Group (hard)☆

    Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. If ...

  8. 【leetcode】Plus One (easy)

    Given a non-negative number represented as an array of digits, plus one to the number. The digits ar ...

  9. 【linux】学习4

    文件压缩: gzip :压缩   解压缩 zcat: 读取压缩文件 gzip text1  :压缩text1 得到 text1.gz 原文件不见了 gzip -c text1 > text1.g ...

  10. 【opencv】轮廓相关

    IplImage* contours_rect; IplImage* contours; CvMemStorage* countours_storage=NULL; if(contours_rect= ...