强制对特定对象和任何扩展进行原子修改

本文关键字:扩展 修改 任何 对象 | 更新日期: 2023-09-27 17:58:28

我有一点读写器问题。

我有一个特定对象的静态集合,许多读者和作者可以同时访问它。

编写器将从集合处理程序中获取一个项,然后以某种方式对其进行修改。

读取器可以从集合处理程序获得该特定项目,然后以某种方式显示它。

现在我意识到这个问题的标准解决方案是创建一个锁(或ReaderWriter锁),并强制每个编写器和读取器进入锁。问题是,我不是唯一一个添加阅读器/写入程序的人,因此有人可能会忘记在实现中使用锁,从而破坏一切。

那么,有没有一种方法,从一个对象的角度,迫使所有的更改都以原子的方式进行?请记住,这个对象将以多种形式扩展,它们也必须以这种方式受到约束。

强制对特定对象和任何扩展进行原子修改

如果不能信任对象的消费者遵守安全规则,那么您就有大问题了。我可以看到两种解决方案:

1) 什么都不做。如果你的消费者编写了损坏的代码,那么他们所处的痛苦将是一个很好的激励,促使他们不再这样做。

1a)你可以让他们更加痛苦,比如说,让你的对象在没有读锁的情况下以某种方式检测到它何时被读取,并抛出异常。这是我们在为JScript和VBScript引擎设计线程规则时所做的;如果用户在不支持该方法的线程上调用了一个方法,那么引擎将返回"灾难性故障"错误代码。该引擎的用户不会犯两次错误;他们很快就会知道哪个线程是正确的,哪个线程是错误的,并停止调用错误的线程。

这是一个更好的解决方案,而不是简单地让呼叫在大多数情况下成功,然后在百万分之一的时间内死于某种疯狂的比赛条件问题。

2) 将获取锁的责任转移到对象中。让消费者正常使用物品;无论何时读写,对象都会取出自己的读写器锁。