image.png

1、ArrayList线程异常演示

  • java.util.ConcurrentModificationException——>并发修改异常
  • 为什么会出现异常?

    1. public class ArrayListDemo {
    2. public static void main(String[] args) {
    3. ArrayList<String> list = new ArrayList<>();
    4. for(int i=1;i<=30;i++) {
    5. new Thread(() -> {
    6. //往集合中添加数据
    7. list.add(UUID.randomUUID().toString().substring(0, 8));
    8. //往集合中取数据
    9. System.out.println(list);
    10. },String.valueOf(i)).start();
    11. }
    12. }
    13. }

    2、ArrayList线程安全解决方案

    1、Vector

    版本古老使用情况不多 ```java public class ArrayListDemo { public static void main(String[] args) {

// ArrayList list = new ArrayList<>();

  1. List<String> list = new Vector<>();
  2. for(int i=1;i<=30;i++) {
  3. new Thread(() -> {
  4. //往集合中添加数据
  5. list.add(UUID.randomUUID().toString().substring(0, 8));
  6. //往集合中取数据
  7. System.out.println(list);
  8. },String.valueOf(i)).start();
  9. }
  10. }

}

  1. <a name="DlhUT"></a>
  2. ### 2、Collections
  3. ```java
  4. public class ArrayListDemo {
  5. public static void main(String[] args) {
  6. // ArrayList<String> list = new ArrayList<>();
  7. //Vector解决方案
  8. // List<String> list = new Vector<>();
  9. //Collections解决方案
  10. List<String> list= Collections.synchronizedList(new ArrayList<>());
  11. for(int i=1;i<=30;i++) {
  12. new Thread(() -> {
  13. //往集合中添加数据
  14. list.add(UUID.randomUUID().toString().substring(0, 8));
  15. //往集合中取数据
  16. System.out.println(list);
  17. },String.valueOf(i)).start();
  18. }
  19. }
  20. }

3、CopyOnWriteArrayList

在往集合中添加数据时,先将结合复制一份,往复制的集合中添加新的内容后,再将复制集合中的内容覆盖到原来的集合中。
image.png

  1. public class ArrayListDemo {
  2. public static void main(String[] args) {
  3. // ArrayList<String> list = new ArrayList<>();
  4. //Vector解决方案
  5. // List<String> list = new Vector<>();
  6. //Collections解决方案
  7. // List<String> list= Collections.synchronizedList(new ArrayList<>());
  8. List<String> list=new CopyOnWriteArrayList<>();
  9. for(int i=1;i<=30;i++) {
  10. new Thread(() -> {
  11. //往集合中添加数据
  12. list.add(UUID.randomUUID().toString().substring(0, 8));
  13. //往集合中取数据
  14. System.out.println(list);
  15. },String.valueOf(i)).start();
  16. }
  17. }
  18. }

3、HashSet

1、异常演示

  1. public class SetDemo {
  2. public static void main(String[] args) {
  3. Set set=new HashSet();
  4. for(int i=1;i<=30;i++) {
  5. new Thread(() -> {
  6. //往集合中添加数据
  7. set.add(UUID.randomUUID().toString().substring(0, 8));
  8. //往集合中取数据
  9. System.out.println(set);
  10. },String.valueOf(i)).start();
  11. }
  12. }
  13. }

2、CopyOnWriteArraySet

  1. public class SetDemo {
  2. public static void main(String[] args) {
  3. // Set set=new HashSet();
  4. Set set=new CopyOnWriteArraySet();
  5. for(int i=1;i<=30;i++) {
  6. new Thread(() -> {
  7. //往集合中添加数据
  8. set.add(UUID.randomUUID().toString().substring(0, 8));
  9. //往集合中取数据
  10. System.out.println(set);
  11. },String.valueOf(i)).start();
  12. }
  13. }
  14. }

4、HashMap

1、异常演示

  1. public class HashMapDemo {
  2. public static void main(String[] args) {
  3. Map map=new HashMap();
  4. for(int i=1;i<=30;i++) {
  5. int finalI = i;
  6. new Thread(() -> {
  7. String key=String.valueOf(finalI);
  8. //往集合中添加数据
  9. map.put(key,UUID.randomUUID().toString().substring(0, 8));
  10. //往集合中取数据
  11. System.out.println(map);
  12. },String.valueOf(i)).start();
  13. }
  14. }
  15. }

2、ConcurrentHashMap

  1. public class HashMapDemo {
  2. public static void main(String[] args) {
  3. // Map map=new HashMap();
  4. Map<String,Object> map=new ConcurrentHashMap();
  5. for(int i=1;i<=30;i++) {
  6. int finalI = i;
  7. new Thread(() -> {
  8. String key=String.valueOf(finalI);
  9. //往集合中添加数据
  10. map.put(key,UUID.randomUUID().toString().substring(0, 8));
  11. //往集合中取数据
  12. System.out.println(map);
  13. },String.valueOf(i)).start();
  14. }
  15. }
  16. }