zoukankan      html  css  js  c++  java
  • 《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类

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

  • 相关阅读:
    2020软件工程作业02
    2020软件工程作业01
    为什么需要平衡二叉树?
    手机号码和邮箱等联系地址,为什么不明文显示?
    请把重要的事看轻 ——2017年终总结
    万事皆空:随缘而定
    微服务:微服务架构模式译文说明
    Mysql 查询—按位运算
    解决:spring security 登录页停留时间过长 跳转至 403页面
    excel模板解析—桥接模式:分离解析模板和业务校验
  • 原文地址:https://www.cnblogs.com/khjian/p/5808638.html
Copyright © 2011-2022 走看看