同步的简单总结:
1.lock:设置锁定和解除锁定的一种简单方式。
2.Interlocked:用于使变量的简单语句原子化。Interlocked.Increment(ref state):以原子操作的形式递增指定变量的值并存储结果。参数:其值要递增的变量。
以线程安全的方式递增,递减,交换,取值。 执行速度比较快。
3.Monitor:lock方式被翻译为Monitor类的Enter()方法,Monitor的Exit()方法解除锁定。
Monitor.TryEnter(obj, 10000, ref lockTaken); 在指定的毫秒数中,尝试获取指定对象上的排他锁,并自动设置一个值,指示是否得到了该锁。
参数: obj: 在其上获取锁的对象。 millisecondsTimeout: 等待锁所需的毫秒数。 lockTaken:尝试获取锁的结果,通过引用传递。 输入必须为 false。 如果已获取锁,则输出为 true;否则输出为 false。 即使在尝试获取锁的过程中发生异常,也会设置输出。
4.spinlock结构:如果有大量锁定,且锁定时间总是非常短,spinlock结构就很有用。除了体系结构的区别,spinlock非常类似与monitor。
5.waithandle基类:用于等待一个信号的设置。
waitone,waitany,waitall.signalorwait(set改变wait返回值,reset不改变)
6.Mutex:提供多个进程同步访问。只有一个线程能获得互斥访问。var mutex = new Mutex(false, "TestCode",out temp);最初有主线程拥有,互斥名称,获得互斥已存在。操作系统能够识别有名称的互斥。
mutex继承waithandle,调用waitone获得互斥,ReleaseMutex释放互斥。可通过temp判断是否获得互斥,false未获得。
7.Semaphore:类似于互斥,信号量可由多个线程使用。是一种计数的互斥锁定。
var semaphore = new SemaphoreSlim(semaphoreCount, semaphoreCount); 同时授予信号量的初始请求数和最大数量。
semaphore.Wait(600):等待600ms,直到到达最大数量时,返回false。否则返回true。
semaphore.Release();释放
8.Events类:同互斥和信号量一样,事件也是一个系统范围内的资源同步方法。ManuelResetEvent,AutoResetEvent,ManuelResetEventSilm,CountdownEvent。
将事件的waithandle进行wait函数调用,同waithandle类,然后事件的set()方法能够释放返回true,reset()方法返回false,wait等方法可以传递时间。
CountdownEvent类可直接wait()方法,signal()方法释放。CountdownEvent(int cout):cout:收到的signal()调用次数后释放wait方法。
9.Barrier:var barrier = new Barrier(numberTasks + 1); 同时工作的线程,+1表示主线程。barrier.SignalAndWait();等待,barrier.RemoveParticipant();释放
10.ReaderWriterLockSlim:读写锁,写读互斥。还需研究。