线程同步浅谈

我们在写代码的时候, 往往会涉及到多线程的作业.同一个应用程序内如果有并发的多线程, 那么意味着必须协调多个线程之间对文件、网络连接和内存等资源的访问。 否则,两个或多个线程可能在同一时间访问同一资源,且不能感知对方的操作。 结果是不可预知的数据损坏。引申而言就是如何在程序内部实现线程同步.

1. Interlocked

可以使用 Interlocked 类的方法来防止多个线程尝试同时更新或比较相同值时可能发生的问题。 该类的方法可从任何线程安全地递增、递减、交换和比较值。

2. lock

C# lock 语句可用于确保代码块运行完成,且不会被其他线程中断。

这是通过在代码块的持续时间内获得给定对象的互斥锁来实现的。

但是要注意尽量不要lock公用对象, 因为公有对象可能会超出你的控制, 外面有其他的程序也在使用这个对象加锁, 则可能会造成死锁的情况发生. 

同时也不要给string字符串进行加锁, 因为string字符串是暂存于CLR当中的.

一般锁住的对象为引用类型, 她可以锁定值类型,但值类型会被装箱,每次装箱后的对象都不一样,会导致锁定无效。

3. monitor

监视器一般不用 ,都用lock, lock的正文中不能出现await.

4. ReadWriteLock

在某些情况下,建议仅在写入数据时锁定资源,并允许多个客户端在数据未更新时同时读取数据。 当线程正在修改资源时,ReaderWriterLock 类强制执行对资源的独占访问,但在读取资源时允许非独占访问。 ReaderWriter 锁可用于代替排它锁。使用排它锁时,即使其他线程不需要更新数据,也会导致其他线程等待。  

 

posted @ 2018-09-05 22:37  YanyuWu  阅读(76)  评论(0)    收藏  举报