多线程下不安全;可能会报错:java.util.ConcurrentModificationException(并发修改异常)
- import java.util.*;
- import java.util.concurrent.CopyOnWriteArrayList;
-
- //java.util.ConcurrentModificationException 并发修改异常
- public class ListTest {
- public static void main(String[] args) {
- //并发下ArrayList是不安全的
- List
-
- //CopyOnWrite 写入时复制 COW 计算机程序应用领域的一种优化策略
- //多个线程调用的时候,list,读取的时候,固定的,写入(覆盖)
- //在写入的时候避免覆盖,造成数据问题
- for (int i = 1; i <= 10; i++) {
- new Thread(()->{
- list.add(UUID.randomUUID().toString().substring(0,5));
- System.out.println(list);
- }).start();
- }
- }
- }
解决方案:
概念:CopyOnWrite写入时复制,计算机程序设计语言的一种优化策略。(保证效率和性能问题)
- import java.util.*;
- import java.util.concurrent.CopyOnWriteArrayList;
-
- //java.util.ConcurrentModificationException 并发修改异常
- public class ListTest {
- public static void main(String[] args) {
- //并发下ArrayList是不安全的
- /**
- * 解决方案:
- * 1.List
- * 2.List
- * 3.List
- * 4.List
- */
- // List
- // List
- // List
- //CopyOnWrite 写入时复制 COW 计算机程序应用领域的一种优化策略
- //多个线程调用的时候,list,读取的时候,固定的,写入(覆盖)
- //在写入的时候避免覆盖,造成数据问题
-
- List
- for (int i = 1; i <= 10; i++) {
- new Thread(()->{
- list.add(UUID.randomUUID().toString().substring(0,5));
- System.out.println(list);
- }).start();
- }
- }
- }
多线程下不安全;可能会报错:java.util.ConcurrentModificationException(并发修改异常)
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.Set;
- import java.util.UUID;
- import java.util.concurrent.CopyOnWriteArraySet;
-
- //java.util.ConcurrentModificationException
-
- public class SetList {
- public static void main(String[] args) {
- HashSet
- for (int i = 1; i <=10 ; i++) {
- new Thread(()->{
- set.add(UUID.randomUUID().toString().substring(0,5));
- System.out.println(set);
- },String.valueOf(i)).start();
-
- }
- }
- }
解决方案:
- import java.util.Collections;
- import java.util.HashSet;
- import java.util.Set;
- import java.util.UUID;
- import java.util.concurrent.CopyOnWriteArraySet;
-
- //java.util.ConcurrentModificationException
- /**
- * 解决方案
- * 1.Set
- * 2.Set
- */
- public class SetList {
- public static void main(String[] args) {
- // HashSet
- // Set
- Set
- for (int i = 1; i <=13 ; i++) {
- new Thread(()->{
- set.add(UUID.randomUUID().toString().substring(0,5));
- System.out.println(set);
- },String.valueOf(i)).start();
-
- }
- }
- }
hashset集合的底层是hashmap的key
多线程下不安全;可能会报错:java.util.ConcurrentModificationException(并发修改异常)
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.UUID;
- import java.util.concurrent.ConcurrentHashMap;
-
- public class MapTest {
- public static void main(String[] args) {
- //hashmap默认值 new Hashmap<>(16,0.75);
- Map
map = new HashMap<>(); - for (int i = 1; i <= 10; i++) {
- new Thread(()->{
- map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
- System.out.println(map);
- },String.valueOf(i)).start();
-
- }
- }
- }
解决方案:
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.UUID;
- import java.util.concurrent.ConcurrentHashMap;
-
- public class MapTest {
- public static void main(String[] args) {
- //hashmap默认值 new Hashmap<>(16,0.75);
- // Map
map = new HashMap<>(); - // Map
map = Collections.synchronizedMap(new HashMap<>()); - ConcurrentHashMap
map = new ConcurrentHashMap<>(); - for (int i = 1; i <= 10; i++) {
- new Thread(()->{
- map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
- System.out.println(map);
- },String.valueOf(i)).start();
-
- }
- }
- }