【发布时间】:2009-07-22 03:57:04
【问题描述】:
请参考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 中同步什么以保证线程安全?
【问题讨论】:
-
您可以在问题中嵌入图片,无需使用外部链接。
标签: java multithreading concurrency thread-safety