上一章我们讲到关于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. Android数据加密之Base64编码算法

    前言: 前面学习总结了平时开发中遇见的各种数据加密方式,最终都会对加密后的二进制数据进行Base64编码,起到一种二次加密的效果,其实呢Base64从严格意义上来说的话不是一种加密算法,而是一种编码算 ...

  2. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  3. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  5. C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...

  6. C# 泛型

    C# 泛型 1.定义泛型类 在类定义中包含尖括号语法,即可创建泛型类: class MyGenericClass<T> { //Add code } 其中T可以遵循C#命名规则的任意字符. ...

  7. PHP安装

    工具 http://www.cnblogs.com/xiwang6428/p/4315049.html http://www.iteye.com/news/22672 1 安装:sudo apt-ge ...

  8. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  9. Lesson 20 One man in a boat

    Text Fishing is my favourite sport. I often fish for hours without catching anything. But this does ...

  10. AngularJs2与AMD加载器(dojo requirejs)集成

    现在是西太平洋时间凌晨,这个问题我鼓捣了一天,都没时间学英语了,英语太差,相信第二天我也看不懂了,直接看结果就行. 核心原理就是require在AngularJs2编译过程中是关键字,而在浏览器里面运 ...