zoukankan      html  css  js  c++  java
  • 异步与并行~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");
                });

    执行的结果

    我们可以看到,共享锁在被访问时,几个线程是同时的;而互斥锁在使用时,则出现了线程之间的等待(阻塞)!

    感谢各位的阅读!

    返回目录

  • 相关阅读:
    Vocabulary Recitation 2020/05/06
    java set TreeSet详解
    vue快速入门~必备基础知识(一)下~过滤器
    vue快速入门~必备基础知识(一)上
    vue入门(二)基于前面的基础的一个小Demo
    Annotation注释详解~
    泛型~详解~
    Collections工具类详解
    TreeMap实现类和SortMap接口
    Map集合-主要HashMap和Hashtable
  • 原文地址:https://www.cnblogs.com/lori/p/5938201.html
Copyright © 2011-2022 走看看