(六)线程--分别用lock以及Interlocked和Monitor类实现线程的临界区操作(互斥)(示例下载)_分别采用临界区与lock加锁方式完成两个子线程之间的互斥。在主线程中使用thread类-程序员宅基地

技术标签: system  string  测试  thread  

(一).描述
   此示例演示分别用lock以及Interlocked和Monitor类实现线程的临界区操作(互斥)
(二).代码
   using System;
using System.Threading;
using System.Collections;

namespace 加锁_实现临界区互斥操作_

 //委托声明(函数签名)
 delegate string MyMethodDelegate();

 class MyClass
 {  
  private static ArrayList arrList = new ArrayList();
  private static int i = 0;
  
  public static void Add()
     {
   //方法一:用 lock 实现
//   lock(arrList)
//   {
//    arrList.Add(i.ToString());
//    i++;
//   }
   
   //方法二: 用Interlicked类实现
//   System.Threading.Interlocked.Increment(ref i);
//   arrList.Add(i.ToString());

   //方法三: 用Monitor类实现
   try
   {
    //I.不限时间
    //stem.Threading.Monitor.Enter(arrList); 
    
    //II.在指定时间获得排他锁
    if(System.Threading.Monitor.TryEnter(arrList,TimeSpan.FromSeconds(30))) //在30秒内获取对象排他锁. 灵活运用可以实现防止死锁功能
    {                                                                       //避免互相等待情况。 在一定时间内得不到排他锁,可能是自己
                                                                         //占用其它排它锁造成的(别的正在等自己正占用的排它锁,而处于等待状态),
                                                                         //这时可以释放掉自己正占用的排他锁后,再试图去得到想要的对象的排他锁
     arrList.Add(i.ToString());                                       
     i++;
    }
   }
   catch
   {
    //发生异常后自定义错误处理代码
   }
   finally
   {
    Monitor.Exit(arrList);  //不管是正常还是发生错误,都得释放对象
   }
  } 
  
  [STAThread]
  static void Main(string[] args)
  {
   Thread thread1 = new Thread(new ThreadStart(Add));
   Thread thread2 = new Thread(new ThreadStart(Add));  
   Thread thread3 = new Thread(new ThreadStart(Add)); 
   thread1.Start();
   thread2.Start();
   thread3.Start();

   Console.Read();

   for(int i=0;i
   {
    Console.WriteLine(arrList[i].ToString());
   }

   Console.Read();

  }
 }
}

本示例代码已经测试,能够正常运行!


(三).示例下载
  http://www.cnblogs.com/Files/ChengKing/ThreadExample.rar
  



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=540644


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/techweb/article/details/1936946

智能推荐

ArcGIS Pro实践二:基于核密度构建时空体素_arcgispro核密度三维可视化-程序员宅基地

文章浏览阅读2.6k次,点赞6次,收藏14次。ArcGIS Pro实践二:基于核密度构建时空体素Step1:核密度分析Step2:构建镶嵌数据集Step3:多维处理Step4:可视化Step5:剖切分析非GIS专业,仅用作自己实操的记录。欢迎大佬批评指正,交流更好的方法~相关知识:1. 什么是体素图层?ArcGIS Pro 文档2. 时态GIS数据模型(麻辣GIS)3. 通过多维栅格图层创建时空立方体 (时空模式挖掘) ArcGIS Pro 文档本文构建的体素模型如下:(图源:链接1)需要注意的是:输入多维栅格图层必须至少有 10 个时_arcgispro核密度三维可视化

使用github遇见的问题_githup. danger zone-程序员宅基地

文章浏览阅读719次。新手使用github常见问题1: 提交代码Contribution数量没有增加出现这种情况,大都是因为github上的邮箱和本地提交代码的邮箱不一致,解决查看本地邮箱和用户git config user.namegit config user.email如果发现不一致,修改本项目的邮箱和账户即可对本项目生效,一般修改项目内的就可以,没必要修改家目录下的.gitconfig文件。..._githup. danger zone

小议查理芒格-程序员宅基地

文章浏览阅读121次。查理芒格说:我的剑传给能够挥舞它的人。查理芒格有三条异于常人之处,值得我们深思。决心致富过上想要的生活查理芒格说:“走到人生的某一个阶段时,我决心要成为一个富有之人。这并不是因为爱钱的缘故,而是为了追求那种独立自主的感觉。”查理芒格坦承自己和巴菲特一样有很强的致富欲望,不是因为自己喜欢法拉利什么,而是自己喜欢独立,极度渴望独立。他在32岁之前经历了无数坎坷,年少时经历了经济大萧条,随后又经历了婚姻...

基础编程数据结构题目7-1最大子列和_输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。 输入-程序员宅基地

文章浏览阅读161次。输入格式:输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。标题输出格式:在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。输入样例:6-2 11 -4 13 -5 -2输出样例:20题解#include <iostream>#include<cstdio>using namespace std;int M..._输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。 输入

Hessian的使用与介绍_使用hessian的好处是什么-程序员宅基地

文章浏览阅读1k次。简介 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议(Binary),因为采用的是二进制协议,所以它很适合于发送二进制数据。Hessian通常通过Web应用来提供服务,因此非常类似于WebService。只是它不使用SOAP协议。 Hessian通过Servlet提供远程服务。需要将匹配某个模式的请求映射到Hessian服务。Spring的Dispatche_使用hessian的好处是什么

CIContext 和CIFilter 报错__objc_class_$_cifilter", referenced from:-程序员宅基地

文章浏览阅读600次。今天写一个关于二维码支付的时候遇到了一个问题,使用苹果提供的CIFilter 和CIContext 时 报了一个 很坑爹的错误 ,错误如下:Undefined symbols for architecture x86_64:"_OBJC_CLASS_$_CIContext", referenced from:objc-class-ref in ErWeiMaViewCo__objc_class_$_cifilter", referenced from:

随便推点

从如何在Java删除乱码文件中开始说起_java中删除文件时文件名乱码问题-程序员宅基地

文章浏览阅读982次。1. 乱码文件为何会生成乱码文件?原因很多,在上传的过程中编码不对,操作提供不支持该编码等,如果你尝试用Java的File对象去删除文件,甚至判断是否存在该文件都会发现返回的都是FalseString[]entries = file.list(); for(String s: entries){ File currentFile = new File(file.getPa..._java中删除文件时文件名乱码问题

flink深入研究(02) flink运行环境的获取(上)_executionenvironment获取当前目录-程序员宅基地

文章浏览阅读1.4k次。// 获取运行环境StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();这行代码会返回一个可用的执行环境,是flink程序执行的上下文,记录了相关配,如并行度等,并提供了一系列方法,如输入流的读入方法,运行整个程序的execute方法等,对于分步式流处理程序来说,flatM..._executionenvironment获取当前目录

Android使用第三方弹出框Sweet Alert Dialog实现退出app (简易新闻 (十五))_android 三方弹框-程序员宅基地

文章浏览阅读1k次。Android第三方弹出框Sweet Alert Dialog学习关于关于_android 三方弹框

Android性能优化之工具篇 — — Android Lint_android 命令打包关闭lint-程序员宅基地

文章浏览阅读2.4w次,点赞12次,收藏37次。官方介绍原文请移步:http://tools.android.com/tips/lintLint简介Android lint是在ADT16提供的新工具,它是一个代码扫描工具,能够帮助我们识别资源、代码结构存在的问题。Lint优化哪些问题遗漏的翻译(没用上的翻译)比如国际化未被翻译的字段值布局性能(以前是 layoutopt工具,可以解决无用布局、嵌套太多、布局太多)未使用..._android 命令打包关闭lint

解决系统切换字号,app内的文字变化导致布局错乱_app缺陷文字错乱-程序员宅基地

文章浏览阅读476次。我们都知道文字一般用sp,很少用xp,然而一旦用sp标注文字的大小当系统的文字大小切换时,app文字也跟着切换会导致布局问题,因此为保持文字不变,可以在baseActivty 中重写一下方法,它会在onCreat 调用,重新初始化文字大小,就不会文字变化。/*** 设置为默认的系统标准字体,不可更改*/@Overridepublic Resources _app缺陷文字错乱

Windows 系统下本地单机搭建 Redis 主从 + 哨兵 + 集群(一主二从三哨兵六-八集群)_windows redis集群搭建一主两从-程序员宅基地

文章浏览阅读1.4k次,点赞23次,收藏24次。一主两从三哨兵集群,当master节点宕机时,通过哨兵(sentinel)重新推选出新的master节点,保证集群的可用性。_windows redis集群搭建一主两从

推荐文章

热门文章

相关标签