Java 在线程之间共享大数据而无需同步访问 例如,考虑在用户将新内容输入到文档中时,在大文档上工作的拼写检查器。为了避免延迟用户的工作,拼写检查在单独的线程上完成,但拼写检查仍需要访问文档。我们可以将对文档的所有访问放在同步块中,但这将迫使编辑线程减速以适应拼写检查线程

Java 在线程之间共享大数据而无需同步访问 例如,考虑在用户将新内容输入到文档中时,在大文档上工作的拼写检查器。为了避免延迟用户的工作,拼写检查在单独的线程上完成,但拼写检查仍需要访问文档。我们可以将对文档的所有访问放在同步块中,但这将迫使编辑线程减速以适应拼写检查线程,java,multithreading,Java,Multithreading,原则上,用户交互线程不应该因为任何原因被阻塞。如果由于从多个线程访问文档而导致延迟,我们希望这些延迟总是发生在拼写检查线程中,但是什么样的线程通信可以保证这一点呢 同样的问题不仅仅适用于拼写检查。当一个线程是某些数据的主要所有者,而另一个线程对数据执行非关键的背景计算时,我们面临相同的情况。我认为解决方案是一种消息传递系统,在这种系统中,次线程向主线程发送请求,这些请求按照主线程自己的速度处理。我只想分享一些技巧: 使用公平的读写锁 使锁细粒度,以使没有线程将锁保持太长时间 将耗时代码移到锁外。

原则上,用户交互线程不应该因为任何原因被阻塞。如果由于从多个线程访问文档而导致延迟,我们希望这些延迟总是发生在拼写检查线程中,但是什么样的线程通信可以保证这一点呢


同样的问题不仅仅适用于拼写检查。当一个线程是某些数据的主要所有者,而另一个线程对数据执行非关键的背景计算时,我们面临相同的情况。我认为解决方案是一种消息传递系统,在这种系统中,次线程向主线程发送请求,这些请求按照主线程自己的速度处理。

我只想分享一些技巧:

  • 使用公平的读写锁
  • 使锁细粒度,以使没有线程将锁保持太长时间
  • 将耗时代码移到锁外。它可能需要复制一些任务上下文
  • 在某些情况下,使用“写时拷贝”。例如,将文档拆分为多个小部分。假设用户只编辑一个零件。用户正在以正常的人的速度编辑。然后,您可以在写入集合时将每个部分制作为副本。如果你想的话,甚至可以收集一批奶牛

  • 你试过用锁吗?如果没有,那么您如何知道存在性能问题?我无法想象为什么拼写检查线程需要持有锁的时间比创建最新更新的本地副本(亚毫秒)所需的时间更长,或者比通知GUI线程拼写错误(同样,亚毫秒)所需的时间更长除非LMAX Disruptor适用于您的应用程序(非常高的吞吐量、非阻塞、有界队列),否则消息传递很可能会使用某种锁。@jameslarge我们希望针对性能进行设计,而不是等到问题出现时才修复它。原则上,UI线程不应该阻塞。对于拼写检查器,我们可能会违反这一原则,但也可能不会。即使我们可能不需要它,但最好知道如何正确地完成它,这样,如果我们以后不得不这样做的话,它就不会引起巨大的检修。