请参考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.仅当遍历次数大于对集合的添加/更新次数时,这才是可行的解决方案。是这样吗