首页 / JAVA / JAVA高并发(JUC)之集合不安全
JAVA高并发(JUC)之集合不安全
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA高并发(JUC)之集合不安全,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2625字,纯文字阅读大概需要4分钟。
内容图文
![JAVA高并发(JUC)之集合不安全](/upload/InfoBanner/zyjiaocheng/633/2da51ec9985d40cdab80a90427bb6e17.jpg)
首先是我们的ArrayList:
这次我们讲解的是集合的不安全,首先我们都知道ArrayList吧!
首先我们拓展几个知识点,ArrayList底层是Object类型的数组,初始容量是10(jdk7之前,jdk8之后是空引用,到add之后会变成10,类似于懒加载的机制),其扩容的方式是每次扩容为之前的一半,比如10会扩容成15,15扩容成22,扩容用到的方法时Arrays的copyof方法,OK,接下来后进入主题。
先看这段代码:
List<String> list=new ArrayList<>();
之后我们通过Lambda表达式来生成几个线程
for (int i = 0; i < 30; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
之后会报异常:
java.util.ConcurrentModificationException 并发修改异常
导致原因:多线程并发争抢统一资源,且没加锁
那么我们有什么解决办法呢??
方法一:
List<String> list = new Vector<>();
Vector集合,底层给add方法加了synchronized(重锁),同一时间段只有一个个线程,效率低,所以这就是为什么集合安全效率低的原因。
方法二:
Collections.synchronizedList(new ArrayList<>());
这是Connections的静态方法,传入一个ArrayList。
方法三:
List<String> list = new CopyOnWriteArrayList<>();
这个JUC包的类,实现了List接口。
底层:volatile Object[] array
其add方法里面加了锁ReentrantLock:
public boolean add(E e) {
final ReentrantLock lock = this.lock; //加锁
lock.lock();
try {
Object[] elements = getArray(); //先得到老版本的集合
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}
**
接着我们来看Set集合:
同样扩展点知识点,HashSet底层数据结构是HashMap(源码构造器里面 new HashMap()),其add方法实际上return map.put(e,PRESENT)==null; PRESENT实际上就是一个object常亮,所以实际上就是HashMap的keys。
同样的步骤:
Set<String> set=new HashSet<>();
for(int i=0;i<30;i++){
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(set);
},String.valueOf(i)).start();
}
同样是报错:
java.util.ConcurrentModificationException
解决方案:
方法一:
Set<String> set=Collections.synchronizedSet(new HashSet<>());
方法二:
Set<String> set=new CopyOnWriteArraySet();
也是JUC的里的类,其构造器其实new CopyOnWriteArrayList();
然后就是我们的Map:
扩展知识:HashMap初始容量,每次扩容为原值得一倍。
Map<String, String> map = new HashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 8));
System.out.println(map);
}, String.valueOf(i)).start();
}
同样的会报错:
java.util.ConcurrentModificationException
解决办法:
Map<String, String> map = new ConcurrentHashMap();
JUC包下。
这次就是本次讲解的JUC之集合不安全,希望能帮助到大家,如果有更好的建议,欢迎大家留言!
内容总结
以上是互联网集市为您收集整理的JAVA高并发(JUC)之集合不安全全部内容,希望文章能够帮你解决JAVA高并发(JUC)之集合不安全所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。