你能把同步成本推到一个线程上吗



我有两个线程:一个主线程负责应用程序的主处理,另一个辅助线程负责从主线程接收数据批并处理并输出数据,无论是向用户、文件还是通过网络。一般来说,处理数据的速度应该比生成数据的速度快得多。我想确保主线程永远不会等待次线程。次线程可以接受任何数量的开销、扩展缓冲区、重做工作等等,唯一的目标是最大化主线程的性能。理想情况下,主线程根本不会synchronize。在Java中,有没有办法将同步成本推到一个线程上?

这是一个解决方案的概要:

  1. 主线程在隔离状态下工作一段时间,将数据堆积到一个集合中;

  2. 当它生成了一个好的批时,它:

    i。为自己创建一个新的集合;

    ii。将装满的收藏放在一边,可供阅读线程拾取;

    iii。CAS将此集合转换为AtomicReference

  3. 读取线程轮询该AtomicReference以获取更新;

  4. 当它注意到它已经被设置时,它会拾取批,将null CASing到共享引用中,这样主线程就知道它可以在.中放入另一个集合

这对于主线程(每个批只有一个CAS操作)具有可忽略的协调成本,假设在共享新批时引用总是已经是null

读取线程可以运行轮询共享引用的繁忙循环,每次读取null时都会休眠少量时间。使线程短时间睡眠的最佳技术是

LockSupport.parkNanos(1);

它通常会休眠大约30µs,整个环路将消耗大约2-3%的CPU时间。当然,如果你想更多地减少CPU时间,你可以使用更长的暂停时间。

请注意,使线程在等待集中等待的协调技术会给双方带来很大的延迟,因此,如果1毫秒的延迟对您来说是一个大问题,您应该远离它们。

最简单的方法是没有大小限制的BlockingQueue(LinkedBlockingQueu)作为通信的基础,如果你的意思是主线程在发送数据时等待其他线程,那么它将防止主线程的"同步"成本。

相关内容

  • 没有找到相关文章

最新更新