一、同步、异步

  首先我们得跳出我们的固有思维,我们生活中常说的同步就是一起执行,但是计算机中同步却是另外的概念!

  举个例子,你家里只有一个洗手间,但是你跟你爸都想上厕所,怎么办?只能一个一个来,没有问题,问题

在于你在等你爸从洗手间出来的这段时间里,你是站在门口一直等还是去干其他的?那么同步跟异步的概念就可以这样解释:

  同步:你在门口一直等,你爸用完了你进去,要是你妈也来了,也是站在后面等,就像排队挂号一样。把人当做线程,把洗手间当做资源,

同一时间多个线程申请使用一个资源,要是在后面排队就是线程同步。

  那异步呢?很简单,你申请了想要用洗手间,但是你去看电视了,这个就叫异步,等有人告诉你洗手间空出来了,你再决定要不要去,当然你肯定得去,

只是你可以自己决定什么时候去。一个线程同一时间访问多个资源,便称之为异步。

二、实现同步的几种方式

1、Lock,加锁是最直接的方式,给共享资源加上限制,同一时间只能有一个线程访问。判断两个线程之间是否同步,只需判断两个线程是否用的同一把锁。

lock(Object obj)
{...}
//只需判断lock中的资源是否一样,就可以判断线程之间是否同步

2、Mutex,互斥量,原始的同步方式,初始化Mutex实例的时候把共享资源当做互斥体传进去,通过判断当前线程是否拥有互斥体来给予访问权限。

有就允许获取,没有就滚。注意:声明了互斥量在当前线程使用完之后必须关闭,因为它是全局的。

Mutex mutex =  new Mutex(bool b);
//初始化的时候,true则表示当前线程已拥有互斥体,false则没有

3、Monitor,避免出现死锁,TryEnter方法会尝试获取被lock的资源,如果超时参数过时了,就返回false

Monitor.TryEnter(object lock,TimeSpan.FromSeconds(5));
//lock就是申请访问的资源,这个资源如果被加锁了,那么等过了5s之后没有释放的话,这段代码就会返回false

4、Interlock,原子操作。相较于加锁,Interllock可以中途停止。Interllock提供了Increment、Derement、Add等基本数学操作的原子方法。

Interlock.Increment(ref t);
//Increment可以实现递增(+1),一般里面放的是整型

三、异步

  其实个人理解认为同步、异步都是一种状态,可以形容线程,也可以形容计算机的工作方式,还可以形容任务,具体内容可以了解一下async、await方法