2010-04-15 31 views
3

我正在使用java.nio api编写网络应用程序。我的计划是在一个线程上执行I/O,并在另一个线程上处理事件。要做到这一点,我需要同步读/写,以便从未满足竞争条件。同步费用是多少?

铭记我需要处理成千上万的并发连接,是同步值得的,或者我应该使用一个线程用于I/O和事件处理?

+0

这是一个非常普遍的问题。这在很大程度上取决于您如何使用同步。很明显,同步比不昂贵,但是...如果你需要它,你需要它。 – 2010-04-15 16:19:33

+0

愿意付多少钱? ;-) – mjv 2010-04-15 16:20:58

回答

3

你在做什么样的事件处理?可能的瓶颈在哪里?你甚至有瓶颈吗?

先从最简单的实现和优化掉的瓶颈,一旦你认识他们。

如果你发现你的网络IO线程没有阅读速度不够快,因为它花费太多时间处理事件,然后做一个缓冲队列,同步到这一点,必须通过队列中的事件处理线程的工作。

您可能需要设置队列的大小有限制,所以你最终不会运行内存,虽然。如果网络线程即将溢出队列,请等待,直到有更多空间。

不成熟的优化对任何人都不好玩。

然而,要回答你的问题,两个线程之间的同步也不太可能会成为一个瓶颈,你不应该担心它的开销。

+0

@Ben:我想你的意思是“**不应该担心它的开销” – 2010-04-15 16:24:42

+0

是的,抱歉,现在修复。 – 2010-04-15 16:26:16

+0

我想解耦读/写和事件处理,但如果同步过于昂贵,我认为它不值得。 想象一下,每秒同步数千次;会导致太多的压力? – someguy 2010-04-15 16:29:08

0

我认为它的效率将取决于同步部分的精细程度是。