集合线程安全——JUC随记4
创始人
2025-05-29 11:23:48

1、ArraryList

1.1、ArraryList线程不安全演示

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;public class ThreadDemo04 {public static void main(String[] args) {List list = new ArrayList<>();for (int i = 0; i <=10 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,8));System.out.println(list);},String.valueOf(i)).start();}}

在这里插入图片描述

1.2、解决方案

1. 2.1、使用Vector

import java.util.List;
import java.util.UUID;
import java.util.Vector;public class ThreadDemo04 {public static void main(String[] args) {//List list = new ArrayList<>();List list = new Vector<>();for (int i = 0; i <=20 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,8));System.out.println(list);},String.valueOf(i)).start();}}
}

原理:使用同步关键字 synchronized
源码:

  /*** Adds the specified component to the end of this vector,* increasing its size by one. The capacity of this vector is* increased if its size becomes greater than its capacity.** 

This method is identical in functionality to the* {@link #add(Object) add(E)}* method (which is part of the {@link List} interface).** @param obj the component to be added*/public synchronized void addElement(E obj) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = obj;}

1.2.2、使用Collections

import java.util.*;public class ThreadDemo04 {public static void main(String[] args) {//List list = new ArrayList<>();List list = Collections.synchronizedList(new ArrayList<>());for (int i = 0; i <=20 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,8));System.out.println(list);},String.valueOf(i)).start();}}
}

1.2.3、使用CopyOnWriteArrayList

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;public class ThreadDemo04 {public static void main(String[] args) {//List list = new ArrayList<>();List list = new CopyOnWriteArrayList<>();for (int i = 0; i <=20 ; i++) {new Thread(()->{list.add(UUID.randomUUID().toString().substring(0,8));System.out.println(list);},String.valueOf(i)).start();}}
}

原理:写时复制技术(类似多人签到)
源码:

 /*** Appends the specified element to the end of this list.** @param e element to be appended to this list* @return {@code true} (as specified by {@link Collection#add})*/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();}}

2、HashSet

2.1、HashSet线程不安全演示

import java.util.*;public class ThreadDemo04 {public static void main(String[] args) {Set set = new HashSet<>();for (int i = 0; i <=20 ; i++) {new Thread(()->{set.add(UUID.randomUUID().toString().substring(0,8));System.out.println(set);},String.valueOf(i)).start();}}
}

在这里插入图片描述

2.2、解决方案

2.2.1、使用CopyOnWriteArraySet

import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

public class ThreadDemo04 {
public static void main(String[] args) {
//Set set = new HashSet<>();
Set set = new CopyOnWriteArraySet<>();
for (int i = 0; i <=20 ; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}

3、HashMap

3.1、HashMap线程不安全演示

import java.util.*;public class ThreadDemo04 {public static void main(String[] args) {Map map = new HashMap<>();for (int i = 0; i <=20 ; i++) {String key=String.valueOf(i);new Thread(()->{map.put(key,UUID.randomUUID().toString().substring(0,8));System.out.println(map);},String.valueOf(i)).start();}}
}

在这里插入图片描述

3.2、解决方案

3.2.1、使用ConcurrentHashMap

public class ThreadDemo04 {public static void main(String[] args) {//Map map = new HashMap<>();Map map = new ConcurrentHashMap<>();for (int i = 0; i <=20 ; i++) {String key=String.valueOf(i);new Thread(()->{map.put(key,UUID.randomUUID().toString().substring(0,8));System.out.println(map);},String.valueOf(i)).start();}}
}

相关内容

热门资讯

脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
玛雅人的五大预言 玛雅人预言2... 曾经玛雅人预言2012年是世界末日,但当时好像没有发生什么。没想到10年后的2022年,疫情,战争,...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
cad打印线条粗细设置 cad... 004-线型(下)打印样式设置和线型文件使用一、线宽设置方法制图规范里边的线宽要求,我们已经定义好,...