• 学习多线程 笔记


    首先先来个一线的链接吧 毕竟我是看着他的博客写的

    http://www.cnblogs.com/huangxincheng/archive/2012/03/14/2395279.html

    一:Thread的使用

      Start 开始

      Stop 结束

      sleep  延迟 阻塞的指定时间

      Abort 相当于break 抛出的是  ThreadAbortException 异常。

      join 可以让并发行处理变成串行化      阻塞调用线程,直到某个线程终止时为止。

      Interrupt 如果终止工作线程,只能管到一次,工作线程的下一次sleep就管不到了,相当于一个 contine操作。 抛出的是 ThreadInterruptedException 异常。

      

      进入临界区
      Monitor.Enter(obj);
      、、、、、内容
      退出临界区
      Monitor.Exit(obj);

      Monitor.Wait和Monitor.Pulse

      首先这两个方法是成对出现,通常使用在Enter,Exit之间。

      Wait: 暂时的释放资源锁,然后该线程进入”等待队列“中,那么自然别的线程就能获取到资源锁。

       Pulse:  唤醒“等待队列”中的线程,那么当时被Wait的线程就重新获取到了锁。

    ReaderWriterLock类

        先前也知道,Monitor实现的是在读写两种情况的临界区中只可以让一个线程访问,那么如果业务中存在”读取密集型“操作,就

    好比数据库一样,读取的操作永远比写入的操作多。针对这种情况,我们使用Monitor的话很吃亏,不过没关系,ReadWriterLock

    就很牛X,因为实现了”写入串行“,”读取并行“。

    ReaderWriteLock中主要用3组方法:

    <1>  AcquireWriterLock: 获取写入锁。

              ReleaseWriterLock:释放写入锁。

    <2>  AcquireReaderLock: 获取读锁。

              ReleaseReaderLock:释放读锁。

    <3>  UpgradeToWriterLock:将读锁转为写锁。

             DowngradeFromWriterLock:将写锁还原为读锁。

    ReaderWriterLock rw = new System.Threading.ReaderWriterLock();
     //写锁
    rw.AcquireWriterLock(TimeSpan.FromSeconds(30));
    //释放锁
    rw.ReleaseWriterLock();

    //读锁
    rw.AcquireReaderLock(TimeSpan.FromSeconds(30));
    //释放锁
    rw.ReleaseReaderLock();

    今天整理“信号量”的相关知识,其实想想也蛮有趣的,锁,互斥,信号量都可以实现线程同步,在framework里面主要有三种。

    <1>:ManualResetEvent

    <2>:AutoResetEvent

    <3>: Semaphore

    一:ManualResetEvent

          该对象有两种信号量状态True和False,好奇的我们肯定想知道True和False有什么区别,稍后的例子见分晓,有三个方法值得学习一下。

    1:WaitOne

         该方法用于阻塞线程,默认是无限期的阻塞,有时我们并不想这样,而是采取超时阻塞的方法,如果超时就放弃阻塞,这样也就避免了无限期

           等待的尴尬。

    2:Set

         手动修改信号量为True,也就是恢复线程执行。

    3:ReSet

         手动修改信号量为False,暂停线程执行。



    二:AutoResetEvent

          在VS对象浏览器中,我们发现AutoResetEvent和ManualResetEvent都是继承于EventWaitHandle,所以基本功能是一样的,不过值得注意

    的一个区别是WaitOne会改变信号量的值,比如说初始信号量为True,如果WaitOne超时信号量将自动变为False,而ManualResetEvent则不会。

    三:Semaphore 

         这玩意是.net 4.0新增的,用于控制线程的访问数量,默认的构造函数为initialCount和maximumCount,表示默认设置的信号量个数和

    最大信号量个数,其实说到底,里面是采用计数器来来分配信号量,当你WaitOne的时候,信号量自减,当Release的时候,信号量自增,然而

    当信号量为0的时候,后续的线程就不能拿到WaitOne了,所以必须等待先前的线程通过Release来释放。

    暂停学这个 

  • 相关阅读:
    实用的网络流量监控脚本
    校园招聘面试总结
    简单的HttpClient使用
    大日志处理问题
    <Interview Problem>最小的“不重复数”
    <Interview Problem>二叉树根到叶节点求和值匹配
    安装后端阿里云sdk
    ModuleNotFoundError: No module named 'Crypto'
    pip install 报错 ERROR: Could not find a version that satisfies the requirement PIL (from versions: none) ERROR: No matching distribution found for PIL
    dva+antd初体验
  • 原文地址:https://www.cnblogs.com/lxyh/p/2714887.html
Copyright © 2020-2023  润新知