拷贝枚举器以加强效率

2016-02-19 18:58 0 1 收藏

今天图老师小编给大家精心推荐个拷贝枚举器以加强效率教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)


  当一个代码段正对集合进行枚举而另一段代码试图修改这个集合时,就会发生常见的多线程问题。解决这一问题的方法是在处理前拷贝一份枚举变量。
  
  在撰写多线程代码时,你碰到过多少次下面的提示:
  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( );
  }
  }
  枚举器的只读拷贝将用在同步状态上的时间减少到最小,因此可以增强全局的效率。

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

来源:https://www.tulaoshi.com/n/20160219/1619686.html

延伸阅读
标签: Web开发
在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留)。然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式——JSON来实现它。 如下,我们来定义Week的枚举: if(typeof WeekDay == "undefined"){ var WeekDay = {}; ...
C++类对象的复制-拷贝构造函数(深拷贝,浅拷贝),进一步理解类成员的操作! 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: //程序作者:管宁 ...
标签: Web开发
From: JavaEye.com 枚举JavaScript对象的函数: function iterator(obj) {  for (var property in obj) {  document.writeln("p" + property + " : " + obj[property] + "/p");  } } 一个简单示例(test.js): function&nb...
标签: Web开发
从“译言”上的一篇文章据悉各浏览器 Javascript 的对比。我个人作为一名“准”的 Javascript 开发者,对此事自然比较的关注。SunSpider 的测试面我还是保持对其信任的态度的,正如原文所说的“它是一组被精心设计的测试,易于运行也非常全面”。 下面是测试的内容: 3d - 纯粹 JavaScript 的...
UC浏览器加强在线视频功能   UC浏览器官方微博发布了一张宣传图,图中显示UC浏览器的下一版本将强化播放在线视频的能力。据内部消息,UC浏览器将通过和百度影音、快播独家合作,继承百度影音和快播的播放插件,全面支持在线视频播放。 UC浏览器宣传图 据介绍,新版UC浏览器支持任何需要安装快播或者百度影音的网页视频播...

经验教程

341

收藏

81
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部