一些关于 .NET 中多线程的新手问题,我认为这将有助于强化我正在尝试吸收的一些概念——我已经阅读了一些多线程材料(包括 Albahari 电子书),但我觉得我只需要确认一些问题帮助将这些概念带回家
锁定范围保护代码的共享区域 - 假设有一个线程执行一个方法,该方法在循环中增加一个简单的整数变量 x - 但是这不会保护其他地方的代码也可能改变变量 x 例如在另一个线程的另一个方法中...
由于这是两个不同的代码区域,可能会影响同一个变量,我们是否可以通过在变量 x 周围的两个锁定范围内使用相同的锁定变量锁定两个代码区域来解决这个问题?如果您使用不同的锁定变量锁定两个代码区域,这不会保护变量正确吗?
为了进一步说明这个例子,使用相同的锁变量,如果由于某种原因,一个方法中的代码进入某个无限循环并且从未放弃锁变量会发生什么 - 另一种方法中的第二个代码区域如何检测到这一点?
锁变量的选择如何影响锁的行为?我已经阅读了很多关于这个主题的帖子,但似乎永远找不到明确的答案——在某些情况下,人们明确地为此目的使用对象变量,其他时候人们使用 lock(this),最后我'见过人们使用类型对象。
锁变量的不同选择如何影响锁的行为/范围,在哪些场景中使用其中一个更有意义?
- 假设您有一个包含在一个类中的哈希表,该类公开 add、remove、get 和某种计算方法(例如,每个对象代表一个数量,并且此方法对每个值求和)并且所有这些方法都被锁定 - 但是,一旦对对象的引用在该集合可供其他代码使用并通过应用程序传递时,该对象(不是哈希表)现在将位于该类方法周围的锁定范围之外..然后您如何保护对这些实际对象的访问/更新来自哈希表,这可能会干扰计算方法?
感谢提供的任何启发式方法,这将有助于加强我的这些概念 - 谢谢!