Java进击C#——语法之线程同步
上一章我们讲到关于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#——语法之线程同步的更多相关文章
- Java进击C#——语法之IO操作
本章简言 上一章我们对线程同步进行讲解.了解如何去处理可能发生的脏数据.而本章就要讲有关于C#在读取IO文件的时候,常常用到的操作类.这一章的内容会比较少.但是笔者还是总结出来让读者们有一个学习的方向 ...
- Java进击C#——语法之多线程
本章简言 上一章中笔者对C#一些独有的语法点进行讲解,相信也可以看C#的一些神奇之处.那么本章主要是放在多线程这方面的知识.不管是C#还是JAVA在开发过程或多或少都会用到关于多线程的编程.当然笔者不 ...
- JAVA基础知识之多线程——线程同步
线程安全问题 多个线程同时访问同一资源的时候有可能会出现信息不一致的情况,这是线程安全问题,下面是一个例子, Account.class , 定义一个Account模型 package threads ...
- java多线程之Lock线程同步
1.线程同步: package cn.itcast.heima2; import java.util.concurrent.locks.Lock; import java.util.concurren ...
- Java多线程系列三——实现线程同步的方法
两种实现线程同步的方法 方法 特性 synchronized 不需要显式地加解锁,易实现 ReentrantLock 需要显式地加解锁,灵活性更好,性能更优秀,结合Condition可实现多种条件锁 ...
- Java并发编程:Java中的锁和线程同步机制
锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ...
- Java 基础【07】线程同步锁的选择
在需要线程同步的时候如何选择合适的线程锁? 例:选择可以存入到常量池当中的对象,String对象等 public class SyncTest { private String name = &quo ...
- java多线程之synchronized(线程同步)
一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...
- java多线程(2) 线程同步
我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步. 例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public c ...
随机推荐
- excel 日期/数字格式不生效需要但双击才会生效的解决办法
原因: Excel2007设置过单元格格式后,并不能立即生效必须挨个双击单元格,才能生效.数据行很多.效率太低. 原因:主要是一些从网上拷贝过来的日期或数字excel默认为文本格式或特殊-中文数字格式 ...
- WPF 微信 MVVM 【续】修复部分用户无法获取列表
看过我WPF 微信 MVVM这篇文章的朋友,应该知道我里面提到了我有一个小号是无法获取列表的,始终也没找到原因. 前两天经过GitHub上h4dex大神的指导,知道了原因,是因为微信在登录以后,web ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- iOS开发之Masonry框架源码深度解析
Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...
- 深入Java虚拟机--判断对象存活状态
程序计数器,虚拟机栈和本地方法栈 首先我们先来看下垃圾回收中不会管理到的内存区域,在Java虚拟机的运行时数据区我们可以看到,程序计数器,虚拟机栈,本地方法栈这三个地方是比较特别的.这个三个部分的特点 ...
- MySQL+Amoeba实现数据库主从复制和读写分离
MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...
- Android Bitmap 和 ByteArray的互相转换
Android Bitmap 和 ByteArray的互相转换 移动平台图像处理,需要将图像传给native处理,如何传递?将bitmap转换成一个 byte[] 方便传递也方便cpp代码直接处理图像 ...
- JavaMail发送邮件
发送邮件包含的内容有: from字段 --用于指明发件人 to字段 --用于指明收件人 subject字段 --用于说明邮件主题 cc字段 -- 抄送,将邮件发送给收件人的同时抄 ...
- 当前端也拥有 Server 的能力
今天看了不少文章,比较感兴趣的是 Cache API.它是浏览器 Request/Response 的缓存管理工具,其使用风格和运用场景让我瞬间联想到了 ServiceWorker 和 Fetch A ...
- 【转】 C#中Finally的一个不太常见的用法
原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concu ...