我是靠谱客的博主 无聊啤酒,最近开发中收集的这篇文章主要介绍Java 编码规约梳理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程类

1、 线程池的创建不允许使用executes 去创建,而是通过 ThreadPoolTaskExecutor 的方式去创建。
https://www.cnblogs.com/bfyq/p/10845700.html

2、不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁。
正例: Iterator iterator = list.iterator();

while (iterator.hasNext()) {

String item = iterator.next();

if (删除元素的条件) {

iterator.remove();

}

}

反例: List list = new ArrayList();

list.add(“1”);

list.add(“2”);

for (String item : list) {

if (“1”.equals(item)) {

list.remove(item);

}

}

说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的 结果吗?
根本原因在于expectedModCount与modCount他们的不相等,由于执行了ArrayList中的remove(),modCount在每一次循环值会发生改变,而expectedModCount并没有发生,在执行checkForComodification()方法就会抛出异常。

总结:如果我们我们用foreach删除的元素刚好是最后一个,删除完成前cursor刚好等于size的大小。但是,删除完成后size的数量减1,但是cursor并没有变化。导致下一次循环不相等继续向下执行,导致检查数组不通过,抛出java.util.ConcurrentModificationException

重要参数:

modCount:是ArrayList修改的次数,在add()、remove()/removeAll()、clear()等方法中会修改modCount的值。

expectedModCount:在获得ArrayList对象的Iterator的时候,把modCount的初值赋给expectedModCount

语句1: list.iterator() 返回的是一个Itr对象,

语句2: next()方法中,首先会执行checkForComodification()方法(源码如下),如果 modCount != expectedModCount 就会抛出ConcurrentModificationException异常,在语句3中,执行了list.remove(temp),会修改modCout的值,那么在下一次执行next()方法的时候就会报错!! 所以不要在foreach循环里面进行元素的remove/add操作

遍历要用迭代遍历去删除 集合中的元素,如果并发情况下,要加锁。

可以参考 大佬总结

点这里
https://www.jianshu.com/p/bc8fed863eca?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

最后

以上就是无聊啤酒为你收集整理的Java 编码规约梳理的全部内容,希望文章能够帮你解决Java 编码规约梳理所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部