ConcurrentModificationException主要原因及处理方法
当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行, java.util.ConcurrentModificationException 异常也将被抛出。
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.
当使用 fail-fast iterator 对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,即使是在单线程下运行, java.util.ConcurrentModificationException 异常也将被抛出。
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.
Tags: Exception
在付款记录中挂了几天在支付中终于在2008年8月30日晚变成了付款已经签发,共109.65美元。TMD的终于可以取钱去了。
第二天起来早上拼命的往网站里面添加内容,有钱的日子更加有动力了,下午跑到邮政去取款。我靠,今天是星期天,邮政不办理西联快汇,白开心了一会。
今天终于迎来了周一,早上跑到邮政去,MMD的,还要填收汇单,最麻烦的还是要填发汇人的姓名地址。又白跑了一趟,回来赶快上网去查别人是怎么填写的,回来才知道发汇人的资源原来在付款记录上是有的,只是自己没细心去看。
为了取这一笔广告费用可不容易啊,一共跑了三次。这一会得到的教训就是,属于政府部门有相关的,周六日一般办理不了,任何事情先上网了解清楚了再去办理。
顺便记录一下最近网赚的经历:今天查了一下gg ad的收入,8月份还差那么一点就满30美元了,平均每天1刀,属于低水平;百度搜索也平均每天1rmb左右,阿里妈妈可以说是忽略不算,做淘客至今一分钱也没进帐。今天主要完成两件事:将顶部的banner广告换成了联想的cps广告,建立了一个网上电脑直销单页。
第二天起来早上拼命的往网站里面添加内容,有钱的日子更加有动力了,下午跑到邮政去取款。我靠,今天是星期天,邮政不办理西联快汇,白开心了一会。
今天终于迎来了周一,早上跑到邮政去,MMD的,还要填收汇单,最麻烦的还是要填发汇人的姓名地址。又白跑了一趟,回来赶快上网去查别人是怎么填写的,回来才知道发汇人的资源原来在付款记录上是有的,只是自己没细心去看。
为了取这一笔广告费用可不容易啊,一共跑了三次。这一会得到的教训就是,属于政府部门有相关的,周六日一般办理不了,任何事情先上网了解清楚了再去办理。
顺便记录一下最近网赚的经历:今天查了一下gg ad的收入,8月份还差那么一点就满30美元了,平均每天1刀,属于低水平;百度搜索也平均每天1rmb左右,阿里妈妈可以说是忽略不算,做淘客至今一分钱也没进帐。今天主要完成两件事:将顶部的banner广告换成了联想的cps广告,建立了一个网上电脑直销单页。
VSS
VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。
源代码版本控制机制是现代软件开发中必不可少的管理机制之一,通常借助版本控制软件即Source Code Management(SCM) systems或者Version Control systems来实现。版本控制在软件开发中的重要作用如下:
1)作为代码仓库有效的管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取。
2)对开发小组中对源代码的访问进行有效的协调(不同的版本控制软件采取不同的协调策略)。
常用的版本控制软件有Clearcase, CVS, PVCS和Microsoft公司的Visual SourceSafe (VSS)。下面对Windows平台开发最常用的Visual SourceSafe 6.0进行简单介绍。
VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。
源代码版本控制机制是现代软件开发中必不可少的管理机制之一,通常借助版本控制软件即Source Code Management(SCM) systems或者Version Control systems来实现。版本控制在软件开发中的重要作用如下:
1)作为代码仓库有效的管理软件开发中各个不同版本的源代码和文档,占用空间小并且方便各个版本代码和文档的获取。
2)对开发小组中对源代码的访问进行有效的协调(不同的版本控制软件采取不同的协调策略)。
常用的版本控制软件有Clearcase, CVS, PVCS和Microsoft公司的Visual SourceSafe (VSS)。下面对Windows平台开发最常用的Visual SourceSafe 6.0进行简单介绍。
Tags: VSS cvs
为了测试各种格式的证书读取操作,我写了个很简单的Test类,结果却出现如下错误:
java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
Tags: Bad version number in class