我是靠谱客的博主 清新鸡翅,最近开发中收集的这篇文章主要介绍[编程语言][java][java se][java.util.ArrayList]ArrayList modCount 同步检查处理参数规避风险,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java代码   收藏代码
  1. /** 
  2.      * The number of times this list has been <i>structurally modified</i>. 
  3.      * Structural modifications are those that change the size of the 
  4.      * list, or otherwise perturb it in such a fashion that iterations in 
  5.      * progress may yield incorrect results. 
  6.      * 
  7.      * <p>This field is used by the iterator and list iterator implementation 
  8.      * returned by the {@code iterator} and {@code listIterator} methods. 
  9.      * If the value of this field changes unexpectedly, the iterator (or list 
  10.      * iterator) will throw a {@code ConcurrentModificationException} in 
  11.      * response to the {@code next}, {@code remove}, {@code previous}, 
  12.      * {@code set} or {@code add} operations.  This provides 
  13.      * <i>fail-fast</i> behavior, rather than non-deterministic behavior in 
  14.      * the face of concurrent modification during iteration. 
  15.      * 
  16.      * <p><b>Use of this field by subclasses is optional.</b> If a subclass 
  17.      * wishes to provide fail-fast iterators (and list iterators), then it 
  18.      * merely has to increment this field in its {@code add(int, E)} and 
  19.      * {@code remove(int)} methods (and any other methods that it overrides 
  20.      * that result in structural modifications to the list).  A single call to 
  21.      * {@code add(int, E)} or {@code remove(int)} must add no more than 
  22.      * one to this field, or the iterators (and list iterators) will throw 
  23.      * bogus {@code ConcurrentModificationExceptions}.  If an implementation 
  24.      * does not wish to provide fail-fast iterators, this field may be 
  25.      * ignored. 
  26.      */  
  27.     protected transient int modCount = 0;  

 

      在父类AbstractList中定义了一个int型的属性:modCount,记录了ArrayList结构性变化的次数。

protected transient int modCount = 0;

  在ArrayList的所有涉及结构变化的方法中都增加modCount的值,包括:add()、remove()、addAll()、removeRange()及clear()方法。这些方法每调用一次,modCount的值就加1。

  注:add()及addAll()方法的modCount的值是在其中调用的ensureCapacity()方法中增加的。

  AbstractList中的iterator()方法(ArrayList直接继承了这个方法)使用了一个私有内部成员类Itr,生成一个Itr对象(Iterator接口)返回:

public Iterator iterator() { return new Itr(); }

  Itr实现了Iterator()接口,其中也定义了一个int型的属性:expectedModCount,这个属性在Itr类初始化时被赋予ArrayList对象的modCount属性的值。

int expectedModCount = modCount;

  注:内部成员类Itr也是ArrayList类的一个成员,它可以访问所有的AbstractList的属性和方法。理解了这一点,Itr类的实现就容易理解了。

  在Itr.hasNext()方法中:

public boolean hasNext() { return cursor != size(); }

  调用了AbstractList的size()方法,比较当前光标位置是否越界。

  在Itr.next()方法中,Itr也调用了定义在AbstractList中的get(int)方法,返回当前光标处的元素:

Java代码   收藏代码
  1. public Object next()  
  2. {  
  3.  try  
  4.  {  
  5.   Object next = get(cursor);  
  6.   checkForComodification();  
  7.   lastRet = cursor++;  
  8.   return next;  
  9.  }  
  10.  catch(IndexOutOfBoundsException e)  
  11.  {  
  12.   checkForComodification();  
  13.   throw new NoSuchElementException();  
  14.  }  
  15. }  

 注意,在next()方法中调用了checkForComodification()方法,进行对修改的同步检查:

Java代码   收藏代码
  1. final void checkForComodification()  
  2. {  
  3.  if (modCount != expectedModCount) throw new ConcurrentModificationException(); }  

 现在对modCount和expectedModCount的作用应该非常清楚了。在对一个集合对象进行跌代操作的同时,并不限制对集合对象的元素进行操 作,这些操作包括一些可能引起跌代错误的add()或remove()等危险操作。在AbstractList中,使用了一个简单的机制来规避这些风险。 这就是modCount和expectedModCount的作用所在。





转自:http://liuzhaomin.iteye.com/blog/1038289

最后

以上就是清新鸡翅为你收集整理的[编程语言][java][java se][java.util.ArrayList]ArrayList modCount 同步检查处理参数规避风险的全部内容,希望文章能够帮你解决[编程语言][java][java se][java.util.ArrayList]ArrayList modCount 同步检查处理参数规避风险所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部