我正在使用Netty在UDP上开发VOIP服务器。发出呼叫后,我将“呼叫”对象存储在全局呼叫列表中,如下所示:
public final List<Call> calls = new ArrayList<Call>();
每次收到呼叫的响应时,我都必须遍历列表以找到正确的“呼叫”,然后使用此呼叫对象进行决策,也许将呼叫路由到其他地方,等等。
我目前对此线程问题的懒惰解决方案是,每次我需要访问列表或单个“调用”对象时,在整个列表上使用 synchronized 关键字。我知道这很糟糕,但是对于POC来说是可以的。
现在我需要正确的做法。要访问该列表,使用 ConcurrentHashMap 似乎是一个不错的选择,但是我的问题是: 锁定和访问单个“通话” 对象的正确方法是什么?
我最多可以同时进行4k通话(500个数据包/秒),锁定许多对象是否会成为问题?最好的解决方案是什么?
谢谢!
答案 0 :(得分:0)
您是否需要从外部锁定通话对象?我假设呼叫对象实质上是2个FIFO队列-一个处理从呼叫者1到呼叫者2的音频数据包,第二个处理从呼叫者2到呼叫者1的音频数据包。您可以使用在添加或删除“下一个”数据包时在内部(单独)锁定这些队列的方法。除此之外,在整个调用过程中,调用对象中的数据似乎都是静态的。这也允许在呼叫的每个方向上进行并发数据处理,因为在一个方向上对数据包进行的任何操作都不会影响另一个方向。