快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱h188app_机器人论坛



作者: BUILDER.COM

当一个代码段正对聚拢进行罗列而另一段代码试图改动这个集应时,就会发生常见的多线程问题。办理这一问题的措施是在处置惩罚前拷贝一份罗列变量。

在撰写多线程代码时,你碰到过若干次下面的提示:

Exception in thread "main" java.util.ConcurrentModificationException

这个非常孕育发生的缘故原由有几个。一是直接对聚拢调用删除操作而不是在罗列器上。二是不合的线程试图对聚拢进行增删操作的时刻。

这个办理法子的第一步便是同步代码,使得你在罗列的时刻其它的线程不能和记娱h188app增删记录。然则假如每个罗列历程要进行繁杂的谋略或者是数据库造访的一部分的话,这个同步就会导致可骇的后果。为了削减负面影响,可以拷贝一个只读的罗列器,去掉落同步,然后采纳下列代码所示的措施:

private List list;

public void add(Object obj) {

synchronized(list) {

list.add(obj);

}

}

public void perfor和记娱h188appm( ) {

Iterator iterator = null;

synchronized(list) {

iterator = new CopiedIterator(list.iterator( ));

}

while(iterator.hasNext( )) {

// perform 和记娱h188appresource or cpu hungry work

}

}

紧张的是记着,CopiedIterator不是一个克隆,只是一个只读的拷贝,以是它并没有维持原有的整个功能。最紧张的是,不能再调用CopiedIterator.remove措施了。CopiedIterator.remove的实现如下:

public class CopiedIterator implements Iterator {

private Iterator iterator = null;

public CopiedIterator(Iterator itr) {

LinkedList list = new LinkedList( );

while(itr.hasNext( )) {

list.add(itr.next( )和记娱h188app);

}

this.iterator = list.iterator( );

}

public boolean hasNext( ) {

return this.iterator.hasNext( );

}

public void remove( ) {

throw new UnsupportedOperationException("This is a read-only iterator.

"和记娱h188app);

}

public Object next( ) {

return this.iterator.next( );

}

}

罗列器的只读拷贝将用在同步状态上的光阴削减到最小,是以可以增强全局的效率。

摘自:Net China   光阴:2003年1月13日

您可能还会对下面的文章感兴趣: