zoukankan      html  css  js  c++  java
  • 简单混合锁(HybridLock)

     1     internal sealed class SimpleHybridLock : IDisposable
     2     {
     3         //基元用户模式构造使用
     4         private int m_waiters = 0;
     5 
     6         //基元内核模式构造
     7         private AutoResetEvent m_waiterLock = new AutoResetEvent(false);
     8 
     9         public void Enter()
    10         {
    11             //指出该线程想要获得锁
    12             if (Equals(Interlocked.Increment(ref m_waiters), 1))
    13             {
    14                 //无竞争,直接返回
    15                 return;
    16             }
    17 
    18             //另一个线程拥有锁(发生竞争),使这个线程等待
    19             //线程会阻塞,但不会在CPU上“自旋”,从而节省CPU
    20             //这里产生较大的性能影响(用户模式与内核模式之间转换)
    21             //待WaitOne返回后,这个线程拿到锁
    22             m_waiterLock.WaitOne();
    23         }
    24 
    25         public void Leave()
    26         {
    27             //该线程准备释放锁
    28             if (Equals(Interlocked.Decrement(ref m_waiters), 0))
    29             {
    30                 //无线程等待,直接返回
    31                 return;
    32             }
    33 
    34             //有线程等待则唤醒其中一个
    35             //这里产生较大的性能影响(用户模式与内核模式之间转换)
    36             m_waiterLock.Set();
    37         }
    38 
    39         public void Dispose()
    40         {
    41             m_waiterLock.Dispose();
    42         }
    43     }
  • 相关阅读:
    Ansible运维自动化(配置管理工具)
    Haproxy 概述及搭建
    Hadoop 单机与完全分布式配置
    大数据与Hadoop
    Hadoop 高可用
    kafka原理和集群
    zookeeper原理及搭建
    个人记录点滴
    Java中导入Excel文件
    反射相关
  • 原文地址:https://www.cnblogs.com/xuejietong/p/8640888.html
Copyright © 2011-2022 走看看