拷贝枚举器以加强效率

来源:互联网 发布:php学习文档 编辑:程序博客网 时间:2024/06/06 18:03
<script type="text/javascript">google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//</script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>当一个代码段正对集合进行枚举而另一段代码试图修改这个集合时,就会发生常见的多线程问题。解决这一问题的方法是在处理前拷贝一份枚举变量。在撰写多线程代码时,你遇到过多少次下面的提示:Exception in thread "main" java.util.ConcurrentModificationException 这个异常产生的原因有几个。一是直接对集合调用删除操作而不是在枚举器上。二是不同的线程试图对集合进行增删操作的时候。这个解决办法的第一步就是同步代码,使得你在枚举的时候其它的线程不能增删记录。但是如果每个枚举过程要进行复杂的计算或者是数据库访问的一部分的话,这个同步就会导致可怕的后果。为了减少负面影响,可以拷贝一个只读的枚举器,去掉同步,然后采用下列代码所示的方法: 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不是一个克隆,只是一个只读的拷贝,所以它并没有保持原有的全部功能。最重要的是,不能再调用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( )); } 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( ); } }枚举器的只读拷贝将用在同步状态上的时间减少到最小,因此可以增强全局的效率。
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 男士钻戒 钻戒1克拉多少钱 一克拉钻戒大概多少钱 钻石戒指品牌 50分钻戒多少钱 老凤祥戒指 蒂芙尼订婚戒指价格 卡地亚钻石戒指价格 周大福钻石戒指 老凤祥钻石戒指价格 1克拉的钻戒大概多少钱 卡地亚戒指价格图片 钻戒什么牌子好 定制钻戒哪家好 钻戒一般多少钱 戒指卡地亚 1克拉的钻戒多少钱 1克拉钻戒价格 钻戒的价格 1克拉钻戒 70分钻戒 钻戒多少钱一克拉 钻戒图片2016新款图片 50分钻戒 蓝色钻石戒指 tiffany钻戒价格 钻戒价格表 40分钻戒多少钱 钻戒哪个品牌的好 钻戒订制 1克拉钻戒市场价格 1克拉钻戒报价 钻戒哪家好 实名制钻戒 50分的钻戒 au750钻戒价格 公主方钻戒 一般的钻戒多少钱 钻戒60分 裸钻定制钻戒 四抓钻戒