Java进击C#——语法之线程同步
2016-10-17 16:00
429 查看
上一章我们讲到关于C#线程方向的应用。但是笔者并没有讲到多线程中的另一个知识点——同步。多线程的应用开发都有可能发生脏数据。同步的功能或多或少都会用到。本章就要来讲一下关于线程同步的问题。根据笔者这几年来的.NET开发可以了解到的同步方式至少有四种以上。如。lock、volatile、Monitor等。
对lock的关键字作用跟JAVA的synchronized关键字类似。但有一定的差别。JAVA的synchronized关键字可能修饰在方法上面。可惜C#却不能修饰在方法上面。用法有什么不同吗。那不如让我们看一下代码?
C#:
上面的aomiLock只是一个笔者定义类的一个实例而以。显然笔者是看不出写法上有多大的的区别。对于lock的用法,有一个新人这样子问我:如果我有俩个静态的全局变量。一个用去作lock的参数值。即是上面的aomiLock变理的位置。另一个在lock内部。即是大括号里面。那么可以在别的地方修改lock内部的值呢?我只能跟他说声对不起。可以修改的。
注意:上面有说到volatile关键字事实在JAVA也有volatile关键字。都是作用于变量级别的。作用只是让变理可见。这一点跟JAVA是一样子。同时如果你想用跟synchronized关键字一样子修饰在方法上面的话。不好意思请用[MethodImpl(MethodImplOptions.Synchronized)]。
Monitor类在使用上跟locak的关键字有一点像。只是Monitor类本身提供了太多灵活的功能。大家是否知道JAVA 5.0之后提供的一个叫Lock接口。他的实例类ReentrantLock。他的功能就跟Monitor类类似。
这是一个互斥锁,笔者很少用他来作同步。Mutex类的作用可以到进程之间。所以更多的是被用在一个电脑只能运行一个应用程序的功能上。而且他用的资源比较大。但笔者没有办法证明。总之笔者很少用他就对了。
Mutex类的构造函数第一个参数用于表示。是否在新建Mutex类的时候就获得互斥权利。true表示立即获得。false的话则用WaitOne方法来获得。相信笔者不用多说大家也明白。
SemaphoreSlim类笔者觉得他是一个控制线程量的一个类。他常常用于控制在当前应用最多能运行几个线程或异步运行的数量。笔者更多的用于设计公司的框架的时候应用。
笔者个人认为这个类不属于同步类里面的。更觉得他是一个信号灯的一个概念。可是他却也能实现小功能的同步工作。在设计框架的时候笔者也常常用到。
本章主要介绍关于线程之间同步数据的一些常用的方式。当然以上只是笔者常用到的而以。并不全面。好了本章就到这里了。
lock方式 |
C#:
lock (aomiLock) { Thread.Sleep(300000); i++; Console.WriteLine(aomiLock.Name); }
上面的aomiLock只是一个笔者定义类的一个实例而以。显然笔者是看不出写法上有多大的的区别。对于lock的用法,有一个新人这样子问我:如果我有俩个静态的全局变量。一个用去作lock的参数值。即是上面的aomiLock变理的位置。另一个在lock内部。即是大括号里面。那么可以在别的地方修改lock内部的值呢?我只能跟他说声对不起。可以修改的。
注意:上面有说到volatile关键字事实在JAVA也有volatile关键字。都是作用于变量级别的。作用只是让变理可见。这一点跟JAVA是一样子。同时如果你想用跟synchronized关键字一样子修饰在方法上面的话。不好意思请用[MethodImpl(MethodImplOptions.Synchronized)]。
Monitor类 |
bool acquireLock = false; Monitor.Enter(aomiLock, ref acquireLock); //内容 i++; Console.WriteLine("add i=" + i); Monitor.Exit(aomiLock);
Mutex类 |
1 class Program 2 { 3 public static Mutex mutex; 4 static void Main(string[] args) 5 { 6 bool created; 7 mutex = new Mutex(false, "aomiApplication", out created); 8 9 Console.ReadKey(); 10 11 } 12 13 public static void Add() 14 { 15 for (int i = 0; i < 10; i++) 16 { 17 mutex.WaitOne(); 18 Console.WriteLine("add i=" + i); 19 mutex.ReleaseMutex(); 20 21 } 22 23 } 24 }
Mutex类的构造函数第一个参数用于表示。是否在新建Mutex类的时候就获得互斥权利。true表示立即获得。false的话则用WaitOne方法来获得。相信笔者不用多说大家也明白。
SemaphoreSlim类 |
class Program { public static SemaphoreSlim ss = new SemaphoreSlim(4); static void Main(string[] args) { for (int i = 0; i < 10; i++) { Thread thread = new Thread(Add); thread.Start(); } Console.ReadKey(); } public static void Add() { if (ss.Wait(2000)) { Console.WriteLine("正在运行中"); Thread.Sleep(2000); 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#——语法之基础
- Java进击C#——语法之ADO.NET
- Java进击C#——语法之面向对象
- Java进击C#——语法之多线程
- Java进击C#——语法之基础
- Java进击C#——语法之IO操作
- Java进击C#——语法之知识点的改进
- C#与java的语法区别(1)
- VB.NET 、Java 与 C# 语法对比。
- C# 语法 java 转 C# 接口 多态
- Java、C#区别之语法
- 转给初学者:C#与java的语法区别[转]
- windows Phone 7开发:C#与java不同的一些特殊语法
- 初试刀 浅谈Java和C#在面向对象上语法的区别
- C++ Java C#.net VB.net 语法对比(转)
- JAVA与C#的语法区别
- c#和java的一些语法区别
- C# ,java语法比较
- C#与java语法区别(2)
- C#与java语法简要比较