在线程之间共享大数据而不同步访问

时间:2016-07-28 02:06:17

标签: java multithreading

例如,考虑在用户在文档中键入新内容时处理大型文档的拼写检查程序。为了避免延迟用户的工作,拼写检查在一个单独的线程上完成,但拼写检查器仍然需要访问该文档。我们可以将对文档的所有访问权限放入同步块中,但这会强制编辑线程减速以适应拼写检查线程。

原则上,不应出于任何原因阻止用户交互线程。如果由于从多个线程访问文档而导致任何延迟,我们希望它们总是发生在拼写检查线程中,但是什么样的线程通信将保证?

同样的问题不仅仅适用于拼写检查。每当一个线程是某些数据的主要所有者而另一个线程对数据执行非关键的后台计算时,我们就会遇到相同的情况。我想这个解决方案是某种消息传递系统,其中辅助线程将请求发送到主线程,这些主线程以主线程自己的速度处理。

1 个答案:

答案 0 :(得分:2)

只想分享一些我会用的技巧:

  1. 使用合理的ReadWriteLock。
  2. 使锁定细粒度,使得没有任何线程可以长时间锁定锁定。
  3. 将耗时的代码移到锁外。它可能需要复制一些任务上下文。
  4. 在某些情况下使用Copy-On-Write。例如,将文档拆分为多个小部件。假设用户只编辑一个部件。并且用户正在以正常人的速度进行编辑。然后,您可以使每个部分成为Copy-On-Write集合。如果你愿意的话,甚至可以收集奶牛系列。