国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

拷貝枚舉器以加強(qiáng)效率

2019-11-17 05:59:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

 


當(dāng)一個(gè)代碼段正對(duì)集合進(jìn)行枚舉而另一段代碼試圖修改這個(gè)集合時(shí),就會(huì)發(fā)生常見(jiàn)的多線程問(wèn)題。解決這一問(wèn)題的方法是在處理前拷貝一份枚舉變量。

在撰寫(xiě)多線程代碼時(shí),你碰到過(guò)多少次下面的提示:
Exception in thread "main" java.util.ConcurrentModificationException

這個(gè)異常產(chǎn)生的原因有幾個(gè)。一是直接對(duì)集合調(diào)用刪除操作而不是在枚舉器上。二是不同的線程試圖對(duì)集合進(jìn)行增刪操作的時(shí)候。

這個(gè)解決辦法的第一步就是同步代碼,使得你在枚舉的時(shí)候其它的線程不能增刪記錄。但是假如每個(gè)枚舉過(guò)程要進(jìn)行復(fù)雜的計(jì)算或者是數(shù)據(jù)庫(kù)訪問(wèn)的一部分的話,這個(gè)同步就會(huì)導(dǎo)致可怕的后果。為了減少負(fù)面影響,可以拷貝一個(gè)只讀的枚舉器,去掉同步,然后采用下列代碼所示的方法:

PRivate List list;
public void add(Object obj) {
synchronized(list) {
list.add(obj);
}
}
public void perform( ) {
Iterator iterator = null;
synchronized(list) {
iterator = new CopiedIterator(list.iterator( ));
}
while(iterator.hasNext( )) {
// perform resource or cpu hungry work
}
}
重要的是記住,CopiedIterator不是一個(gè)克隆,只是一個(gè)只讀的拷貝,所以它并沒(méi)有保持原有的全部功能。最重要的是,不能再調(diào)用CopiedIterator.remove方法了。CopiedIterator.remove的實(shí)現(xiàn)如下:

public class CopiedIterator implements Iterator {
private Iterator iterator = null;
public CopiedIterator(Iterator itr) {
LinkedList list = new LinkedList( );
while(itr.hasNext( )) {
list.add(itr.next( ));
}
this.iterator = list.iterator( );
}
public boolean hasNext( ) {
return this.iterator.hasNext( );
}
public void remove( ) {
throw new UnsupportedOperationException("This is a read-only iterator.
");
}
public Object next( ) {
return this.iterator.next( );
}
}
枚舉器的只讀拷貝將用在同步狀態(tài)上的時(shí)間減少到最小,因此可以增強(qiáng)全局的效率。

 



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 邓州市| 海门市| 噶尔县| 丹棱县| 蓬莱市| 南阳市| 吉水县| 石渠县| 青龙| 衢州市| 鄂托克前旗| 宜州市| 长春市| 新蔡县| 安泽县| 兴山县| 射洪县| 精河县| 水富县| 黎川县| 牡丹江市| 望都县| 贺兰县| 肇州县| 民和| 仪陇县| 云和县| 焉耆| 贵德县| 甘孜| 永济市| 浪卡子县| 苏尼特右旗| 祥云县| 洪洞县| 余干县| 龙陵县| 陆良县| 永和县| 正定县| 邵东县|