拷贝枚举器以加强效率

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

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

【 tulaoshi.com - 编程语言 】

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


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

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

 

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

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

延伸阅读
C++类对象的复制-拷贝构造函数(深拷贝,浅拷贝),进一步理解类成员的操作! 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: //程序作者:管宁 ...
标签: Web开发
在JavaScript目前的版本中,没有枚举这个概念(当然,ECMA-262第三版中已经将enum作为关键字保留)。然而,如同JavaScript中没有class一样,但我们仍然可以通过间接的方式——JSON来实现它。 如下,我们来定义Week的枚举: if(typeof WeekDay == "undefined"){ var WeekDay = {}; ...
标签: Web开发
From: JavaEye.com 枚举JavaScript对象的函数: function iterator(obj) {  for (var property in obj) {  document.writeln("p" + property + " : " + obj[property] + "/p");  } } 一个简单示例(test.js): function&nb...
procedure CopyCurrentDBLine(DBGrid: TDBGrid); var   i: Integer;   Line: String; begin   for i := 0 to DBGrid.Columns.Count - 1 do begin     if Assigned(DBGrid.Columns.Grid.Fields[i]) then       if Line = '' then   &...
从C++转到Java上的程序员一开始总是对Java有不少抱怨,其中没有枚举就是一个比较突出的问题。那么为什么Java不支持枚举呢?从程序语言的角度讲,支持枚举意味着什么呢?我们能不能找到一种方法满足C++程序员对枚举的要求呢?那么现在就让我们一起来探讨一下这个问题。 枚举类型(Enumerated Types) 让我们先看下面这...

经验教程

869

收藏

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