![]() |
1
9
让我先确认一下我是否理解这个建议。给出的问题是,我们有一些资源共享给多个线程,称之为
不 已序列化。但是,如果我们有两个调用MyWrite和一个调用MyRead,并且在所有调用中context属性的值都是Z,那么这些调用 是 已序列化。 可能的 ? 对。那可不是个好主意。如上所述,这是一个坏主意,你不应该这样做。 了解为什么这是个坏主意是很有启发性的。 首先,如果属性是值类型(如整数),则此操作将失败。你可能会想,我的上下文是一个ID号,这是一个整数,我想用ID号123序列化对数据库的所有访问,用ID号345序列化所有访问,但不序列化这些访问。 锁定仅适用于引用类型 ,和 装箱一个值类型总是给你一个新分配的框 从未 即使身份证相同也会受到质疑。它会完全破碎。 参考 ,而不是 价值 有时 实习 你可能处于锁定“ABC”和 另一个“ABC”锁等待,有时它不! 决不能锁定对象,除非该对象被专门设计为锁定对象,并且控制对锁定资源的访问的代码控制对锁定对象的访问 .
这里的问题不是锁的“局部”问题,而是全局问题。假设你的财产是
注意,我说的是“简单”而不是“简单”。它把它减少到 几乎不可能得到正确的答案 ,来自 简直不可能得到正确的答案
正确的方法是实现一个新的服务:一个
锁定对象提供程序
.
显然,锁提供程序需要是线程安全的,并且需要非常低的争用,因为 它是一种旨在防止争用的机制 ,所以最好不要 原因 你需要一个C线程专家来设计和实现这个对象 . 这很容易出错。正如我在你文章的评论中提到的,你试图使用一个并发队列作为一种糟糕的锁提供者,这是一个大量的竞争条件错误。 在所有.NET编程中,这是最难纠正的代码之一。我做了将近20年的.NET程序员 编译器的实现部分 |
![]() |
2
0
…然后你会这样使用它:
|
![]() |
a a · 为什么在这个可重入锁示例中需要引用计数? 2 年前 |
![]() |
JohnLBevan · 为什么原子语句上需要锁提示? 7 年前 |
![]() |
Jay Wang · 生产者/消费者实施:陷入消费者循环 7 年前 |
![]() |
Andremoniy · 悲观写入是否锁定整个表? 7 年前 |
![]() |
Marcus Cemes · 选择。。。用于更新在提交后选择旧数据 7 年前 |
![]() |
Ins0maniac · Rails,锁定数据库中的记录 7 年前 |