• 《C#高级编程》读书笔记(十五):任务、线程和同步之四 同步


        lock语句,Interlocked类和Monitor类可用于进程内部的同步。Mutex类、Event类、SemaphoreSlim类和ReaderWriterLockSlim类提供个过个线程之间的线程同步。

    1,Interlocked类

        Interlocked类用于使变量的简单语句原子化。Interlocked类提供了以线程安全的方式递增、递减、交换和读取值的办法。

    public int State
            {
                get
                {
                    lock (this)
                    {
                        return ++state;
                    }
                }
            }

        上面的语句可以用以下语句替代:

    public int State
            {
                get
                {
                    return Interlocked.Increment(ref state);
                }
            }

    2,Monitor类

        lock语句由C#编译器解析为使用Monitor类。下面的lock语句:

            lock(obj)
            {
                //synchroinzed region for obj
            }

        被解析为调用Enter()方法。

                Monitor.Enter(obj);
                try
                {
                    //synchroinzed region for obj
                }
                finally
                {
                    Monitor.Exit(obj);
                }

        与C#的lock语句相比,Monitor类的主要优点是:可以添加一个等待被锁定的超时值。

                bool lockTaken = false;
                Monitor.TryEnter(obj, 500, ref lockTaken);
                if (lockTaken)
                {
                    try
                    {
                        //acquired the lock
                        //synchronized region for obj
                    }
                    finally
                    {
                        Monitor.Exit(obj);
                    }
                }
                else
                {
                    //did't get the lock,do something else
                }

    3,SpinLock结构

        如果基于对象的锁定对象(Monitor)的系统开销由于垃圾回收而过高,就可以使用SpinLock结构。如果有大量的锁定,且锁定的时间总是非常短,SpinLock结构就很有用。

    4,Mutex类

        Mutex(mutual exclusion,互斥)是.NET Framework中提供跨多个进程同步访问的一个类。

    5,Semaphore类

        信号量非常类似于互斥,其区别是,信号量可以同时由多个线程使用。信号量使用计数的互斥锁定。使用信号量,可以定义允许同时访问受旗语锁定保护的资源的线程个数。如果需要限制可以访问可用资源的线程数,信号量就很有用。例如,如果系统有3个物理端口可用,就可以允许3个线程同时访问I/O端口,但第4个线程需要等待前3个线程中的一个释放资源。

    6,Events类

        与互斥和信号量对象一样,事件也是一个系统范围内的资源同步方法。可以使用事件通知其他任务:这里有一些数据,并完成了一些操作等。事件可以发信号,也可以不发信号。

  • 相关阅读:
    玩耍redis遇到的问题之记录
    哈勃望远镜--星柱图
    用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式
    div水平居中
    hibernate和spring下载网址
    intellj idea 如何设置类头注释和方法注释(转载)
    转载:IT人高效的休息方式
    什么是REST?以及RESTful的实现
    easyui datagrid 获取记录数 页数 当前页
    font字体文件跨域
  • 原文地址:https://www.cnblogs.com/khjian/p/5808638.html
Copyright © 2020-2023  润新知