熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

Java技巧:拷貝枚舉器以加強效率

2013-11-15 11:47:18  來源: JSP教程 

  當一個代碼段正對集合進行枚舉而另一段代碼試圖修改這個集合時就會發生常見的多線程問題解決這一問題的方法是在處理前拷貝一份枚舉變量
  
  在撰寫多線程代碼時你遇到過多少次下面的提示
  Exception in thread main javautilConcurrentModificationException
  
  這個異常產生的原因有幾個一是直接對集合調用刪除操作而不是在枚舉器上二是不同的線程試圖對集合進行增刪操作的時候
  
  這個解決辦法的第一步就是同步代碼使得你在枚舉的時候其它的線程不能增刪記錄但是如果每個枚舉過程要進行復雜的計算或者是數據庫訪問的一部分的話這個同步就會導致可怕的後果為了減少負面影響可以拷貝一個只讀的枚舉器去掉同步然後采用下列代碼所示的方法
  
   private List list;
   public void add(Object obj) {
   synchronized(list) {
   listadd(obj);
   }
   }
   public void perform( ) {
   Iterator iterator = null;
   synchronized(list) {
   iterator = new CopiedIterator(erator( ));
   }
   while(iteratorhasNext( )) {
   // perform resource or cpu hungry work
   }
   }
  重要的是記住CopiedIterator不是一個克隆只是一個只讀的拷貝所以它並沒有保持原有的全部功能最重要的是不能再調用CopiedIteratorremove方法了CopiedIteratorremove的實現如下
  
   public class CopiedIterator implements Iterator {
   private Iterator iterator = null;
   public CopiedIterator(Iterator itr) {
   LinkedList list = new LinkedList( );
   while(itrhasNext( )) {
   listadd(itrnext( ));
   }
   erator = erator( );
   }
   public boolean hasNext( ) {
   return eratorhasNext( );
   }
   public void remove( ) {
   throw new UnsupportedOperationException(This is a readonly iterator
   );
   }
   public Object next( ) {
   return eratornext( );
   }
   }
  枚舉器的只讀拷貝將用在同步狀態上的時間減少到最小因此可以增強全局的效率
  
  

From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19628.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.