我正在编写一种多线程观察器,遇到一些设计问题。
比方说,我有某种线程池,其中有要在数据集中执行的任务队列。其中一些仅是读取数据,另一些则覆盖它们。
数据更改后,我想执行notifyall(),以便观察者可以更新()其状态。
执行update()任务的线程,我希望它们来自另一个第二线程池。
有一个问题:在第一个任务队列中的另一个功能开始修改数据之前,如何强制所有update()线程执行其更新操作?
我正在考虑将锁传递给另一个特定线程的事情。
答案 0 :(得分:0)
如果可以,请避免使用锁。这将使多个线程并行工作的目的无法实现。如果由于框架要求(例如GUI线程)而需要在另一个线程上调用update,则锁将导致UI线程阻塞,并会降低性能。
特定的解决方案将取决于特定的情况。您需要给出一个具体的例子,以便给出具体的解决方案。
最好的方法是根本不使用共享对象。让一个线程将不可变的事件发布到队列中,另一个线程可以根据这些事件读取和更新这些事件。
如果需要使用共享对象,为了能够在某个时间点读取对象的状态,可以使用Memento创建可以从对象中读取的对象的快照。第二个线程。
如果需要从第二个线程获取所有更改,则可以保留数据对象中的更改历史记录,以便udpate()
线程可以跟踪其位置并可以在接收到新的更改时读取新的更改更改通知。
如果您不需要历史记录,则保留最后的更改。更新线程可能会跳过一些更改,但最终它将在处理最后一个线程时与数据保持一致。您正在使用多线程,因此无法始终保持一致。
查看this文章。 LMAX团队使用不同的线程,因为他们的 BusinessLogic 只有一个线程。一个线程接收事件并将其放入缓冲区。另一个线程是带有 EventProcessor 的 BusinessLogic 线程来拾取它们并进行处理。他们的解决方案适用于以下情况:您只有一个写入器,并且有多个读取器,并且每个读取器都可以跟踪缓冲区中的位置。如果您只有两个线程,则可以执行以下操作。
您还可以使用Actor model,其中有多个并发的actor通过在它们之间发送消息来协同工作。