hooyantsing's Blog

11_CopyOnWriteArrayList

字数统计: 252阅读时长: 1 min
2020/08/26

11 CopyOnWriteArrayList

狂神说Java JUC并发编程最新版通俗易懂

ArrayList 是线程不安全的

使List线程安全的三种方式

  • List<String> list = new Vector<>(); 效率低,读写 synchronized 加锁,悲观锁
  • List<String> list = Collections.synchronizedList(new ArrayList<>()); 不安全List 转 安全List
  • List<String> list = new CopyOnWriteArrayList<>(); 写入时复制,仅对写入 Lock 加锁

    案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class ListTest {
public static void main(String[] args) {
// java.util.ConcurrentModificationException 并发修改异常:线程不安全
/**
* 解决方案:
* 1. List<String> list = new Vector<>(); 效率低,读写 synchronized 加锁,悲观锁
* 2. List<String> list = Collections.synchronizedList(new ArrayList<>()); 不安全List 转 安全List
* 3. List<String> list = new CopyOnWriteArrayList<>(); 写入时复制,仅对写入 Lock 加锁
*/

List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
new Thread(
() -> {
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)
).start();
}
}
}

探究 CopyOnWriteArrayList(写入时复制)类

CATALOG
  1. 1. 11 CopyOnWriteArrayList
    1. 1.1. 使List线程安全的三种方式
      1. 1.1.1. 案例
      2. 1.1.2. 探究 CopyOnWriteArrayList(写入时复制)类