请参考UML

Connection类的构造函数通过初始化其foos成员

foos = Collections.synchronizedList( new ArrayList<Foo>(10) );

调用Connection#start()时,它将创建Poller的实例(同时将foos引用传递到Poller的构造函数中)并启动Poller(Poller是Runnable)。

问题:Poller线程将基于外部事件将对象添加到列表中或从列表中删除对象。客户端将定期调用Connection#snapshot()来检索列表。由于Poller中的实现将执行检查以避免在添加过程中重复,因此它不是线程安全的。

例如Poller#run的实现
if( _foos.indexOf( newFoo ) == -1 )
{
    _foos.add( newFoo );
}

我可以在Connection和Poller中同步什么以确保线程安全?

最佳答案

我将看一下CopyOnWriteArrayList来代替上面示例中的ArrayList。这样一来,您无需进行任何同步,因为您可以立即使用线程安全集合。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

从API CopyOnWriteArrayList是...

ArrayList中的线程安全变体
所有的变异操作(添加,
集,依此类推)由
制作基础的新副本
数组。

n.b.仅当遍历次数大于对集合的添加/更新次数时,这才是可行的解决方案。是这样吗

07-24 19:08