上一章我们讲到关于C#线程方向的应用。但是笔者并没有讲到多线程中的另一个知识点——同步。多线程的应用开发都有可能发生脏数据。同步的功能或多或少都会用到。本章就要来讲一下关于线程同步的问题。根据笔者这几年来的.NET开发可以了解到的同步方式至少有四种以上。如。lock、volatile、Monitor等。

lock方式

对lock的关键字作用跟JAVA的synchronized关键字类似。但有一定的差别。JAVA的synchronized关键字可能修饰在方法上面。可惜C#却不能修饰在方法上面。用法有什么不同吗。那不如让我们看一下代码?

C#:

lock (aomiLock)
{
Thread.Sleep();
i++; Console.WriteLine(aomiLock.Name);
}

上面的aomiLock只是一个笔者定义类的一个实例而以。显然笔者是看不出写法上有多大的的区别。对于lock的用法,有一个新人这样子问我:如果我有俩个静态的全局变量。一个用去作lock的参数值。即是上面的aomiLock变理的位置。另一个在lock内部。即是大括号里面。那么可以在别的地方修改lock内部的值呢?我只能跟他说声对不起。可以修改的。

注意:上面有说到volatile关键字事实在JAVA也有volatile关键字。都是作用于变量级别的。作用只是让变理可见。这一点跟JAVA是一样子。同时如果你想用跟synchronized关键字一样子修饰在方法上面的话。不好意思请用[MethodImpl(MethodImplOptions.Synchronized)]。

Monitor类

Monitor类在使用上跟locak的关键字有一点像。只是Monitor类本身提供了太多灵活的功能。大家是否知道JAVA 5.0之后提供的一个叫Lock接口。他的实例类ReentrantLock。他的功能就跟Monitor类类似。

bool acquireLock = false;
Monitor.Enter(aomiLock, ref acquireLock); //内容
i++;
Console.WriteLine("add i=" + i); Monitor.Exit(aomiLock);
Mutex类

这是一个互斥锁,笔者很少用他来作同步。Mutex类的作用可以到进程之间。所以更多的是被用在一个电脑只能运行一个应用程序的功能上。而且他用的资源比较大。但笔者没有办法证明。总之笔者很少用他就对了。

  class Program
{
public static Mutex mutex;
static void Main(string[] args)
{
bool created;
mutex = new Mutex(false, "aomiApplication", out created); Console.ReadKey(); } public static void Add()
{
for (int i = ; i < ; i++)
{
mutex.WaitOne();
Console.WriteLine("add i=" + i);
mutex.ReleaseMutex(); } }
}

Mutex类的构造函数第一个参数用于表示。是否在新建Mutex类的时候就获得互斥权利。true表示立即获得。false的话则用WaitOne方法来获得。相信笔者不用多说大家也明白。

 SemaphoreSlim类

SemaphoreSlim类笔者觉得他是一个控制线程量的一个类。他常常用于控制在当前应用最多能运行几个线程或异步运行的数量。笔者更多的用于设计公司的框架的时候应用。

class Program
{
public static SemaphoreSlim ss = new SemaphoreSlim();
static void Main(string[] args)
{ for (int i = ; i < ; i++)
{
Thread thread = new Thread(Add);
thread.Start();
} Console.ReadKey(); } public static void Add()
{
if (ss.Wait())
{
Console.WriteLine("正在运行中");
Thread.Sleep();
ss.Release();
}
else
{
Console.WriteLine("线程忙");
} }
}
AutoResetEvent类

笔者个人认为这个类不属于同步类里面的。更觉得他是一个信号灯的一个概念。可是他却也能实现小功能的同步工作。在设计框架的时候笔者也常常用到。

class Program
{
public static AutoResetEvent mainEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
Thread thread = new Thread(Execute);
thread.Start(); mainEvent.Set();//通知他可以很执行了
Console.ReadKey(); } public static void Execute()
{
mainEvent.WaitOne();
Console.WriteLine("Execute 正在运行中");
//内容 }
}
本章总结

本章主要介绍关于线程之间同步数据的一些常用的方式。当然以上只是笔者常用到的而以。并不全面。好了本章就到这里了。

Java进击C#——语法之线程同步的更多相关文章

  1. Java进击C#——语法之IO操作

    本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...

  2. Java进击C#——语法之多线程

    本章简言 上一章中笔者对C#一些独有的语法点进行讲解,相信也可以看C#的一些神奇之处.那么本章主要是放在多线程这方面的知识.不管是C#还是JAVA在开发过程或多或少都会用到关于多线程的编程.当然笔者不 ...

  3. JAVA基础知识之多线程——线程同步

    线程安全问题 多个线程同时访问同一资源的时候有可能会出现信息不一致的情况,这是线程安全问题,下面是一个例子, Account.class , 定义一个Account模型 package threads ...

  4. java多线程之Lock线程同步

    1.线程同步: package cn.itcast.heima2; import java.util.concurrent.locks.Lock; import java.util.concurren ...

  5. Java多线程系列三——实现线程同步的方法

    两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...

  6. Java并发编程:Java中的锁和线程同步机制

    锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...

  7. Java 基础【07】线程同步锁的选择

    在需要线程同步的时候如何选择合适的线程锁? 例:选择可以存入到常量池当中的对象,String对象等 public class SyncTest { private String name = &quo ...

  8. java多线程之synchronized(线程同步)

    一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...

  9. java多线程(2) 线程同步

    我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步.   例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public c ...

随机推荐

  1. premere cs4绿色版 安装 并且 视频导出 讲解

    最近室友,开始在玩视频剪辑,用的是 premere cs4 绿色版.让他遇到的最大问题也是我之前遇到的最大问题,就是视频导出. 所以我在这里上传一套自己的一点点经验吧. 接下来,我就总结一下 我是怎么 ...

  2. SQL Server-聚焦计算列持久化(二十一)

    前言 上一节我们结束了Hash Match Aggregate和Stream Aggregate的讲解,本系列我们来讲讲关于SQL Server中的计算列问题,简短的内容,深入的理解,Always t ...

  3. C#多线程之线程池篇2

    在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...

  4. canvas与html5实现视频截图功能

    这段时间一直在研究canvas,突发奇想想做一个可以截屏视频的功能,然后把图片拉去做表情包,哈哈哈哈哈哈~~ 制作方法: 1.在页面中加载视频 在使用canvas制作这个截图功能时,首先必须保证页面上 ...

  5. ResponsibleChain(责任链模式)

    /** * 责任链模式 * @author TMAC-J * 老板讲任务交给CTO,CTO自然不会亲自去做,又把人物分配给项目经理,项目经理再把任务分配给组长,组长再分配给个人 * 如果中途哪个环节出 ...

  6. Quartz2D总结

    天了噜,脑子完全懵了,最起码说出来个上下文啊,连这个都给忘了,特此总结一下,并以此缅怀这次面试 Quartz2D的API来自于Core Graphics(这就是为什么CGContextRef是以CG开 ...

  7. MySQL数据库罕见的BUG——Can't get hostname for your address

    在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...

  8. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  9. 1199 Problem B: 大小关系

    求有限集传递闭包的 Floyd Warshall 算法(矩阵实现) 其实就三重循环.zzuoj 1199 题 链接 http://acm.zzu.edu.cn:8000/problem.php?id= ...

  10. 微软.Net 社区虚拟大会 -- 首日重点(dotnetConf 2016)

    6月7日--9日,为期三天的微软.NET社区虚拟大会正式在 Channel9 上召开. 在 Scott Hunter, Miguel de Icaza (Xamarin CTO) , ScottHan ...