我读到有关锁的信息,尽管一点也不了解。
我的问题是,为什么我们使用未使用的object
并将其锁定,以及这如何使某些线程安全或如何在多线程中发挥作用?没有其他方法可以创建线程安全的代码。
public class test {
private object Lock { get; set; }
...
lock (this.Lock) { ... }
...
}
抱歉,我的问题很愚蠢,但是我听不懂,尽管我已经使用了很多次。
最佳答案
当一个线程正在修改另一个线程时从一个线程访问它的数据称为“数据竞争条件”(或简称为“数据竞争”),并且可能导致数据损坏。 (*)
锁只是避免数据争用的一种机制。如果两个(或多个)并发线程锁定了同一个锁定对象的,则在锁定期间,它们不再并发并且不再导致数据争用。本质上,我们是序列化对共享数据的访问。
诀窍是将锁保持为“宽”,因为您必须以避免数据争用,而则保持为“窄”,因为您可以通过并发执行来获得性能。这是一个很好的平衡点,可以很容易地从两个方向突破,这就是为什么多线程编程很难实现的原因。
一些准则:this
或公共(public)字段作为锁定对象通常是一个坏主意的原因。 lock
关键字只是Monitor.Enter和Monitor.Exit的一种更方便的语法。 Monitor.Enter
的调用中,value objects将是框内的,这意味着线程将不会共享同一锁定对象,从而使数据不 protected 。因此,仅将引用类型用作锁定对象。 name
传递给Mutex Constructor来创建。全局互斥锁提供的功能与常规“本地”锁定基本相同,不同之处在于它们可以在单独的进程之间共享。
(*)之所以称为“竞赛”,是因为并发线程正在“竞赛”走向对共享数据执行操作,而赢得比赛的人将决定操作的结果。因此,结果取决于执行的时序,这在现代抢先式多任务OS上基本上是随机的。更糟糕的是,通过使用诸如调试器之类的工具来观察程序执行的简单 Action ,就很容易修改定时,这使它们变成"heisenbugs"(即,仅通过观察 Action 就可以改变所观察到的现象)。
关于c# - 多线程概念和C#中的锁定,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10152613/