5
5
- [ 二 ConcurrentHashMap] ( #二-concurrenthashmap )
6
6
- [ 三 CopyOnWriteArrayList] ( #三-copyonwritearraylist )
7
7
- [ 3.1 CopyOnWriteArrayList 简介] ( #31-copyonwritearraylist-简介 )
8
- - [ 3.2 CopyOnWriteArravList 是如何做到的?] ( #32-copyonwritearravlist -是如何做到的? )
9
- - [ 3.3 CopyOnWriteArravList 读取和写入源码简单分析] ( #33-copyonwritearravlist -读取和写入源码简单分析 )
10
- - [ 3.3.1 CopyOnWriteArravList 读取操作的实现] ( #331-copyonwritearravlist -读取操作的实现 )
11
- - [ 3.3.2 CopyOnWriteArravList 写入操作的实现] ( #332-copyonwritearravlist -写入操作的实现 )
8
+ - [ 3.2 CopyOnWriteArrayList 是如何做到的?] ( #32-copyonwritearraylist -是如何做到的? )
9
+ - [ 3.3 CopyOnWriteArrayList 读取和写入源码简单分析] ( #33-copyonwritearraylist -读取和写入源码简单分析 )
10
+ - [ 3.3.1 CopyOnWriteArrayList 读取操作的实现] ( #331-copyonwritearraylist -读取操作的实现 )
11
+ - [ 3.3.2 CopyOnWriteArrayList 写入操作的实现] ( #332-copyonwritearraylist -写入操作的实现 )
12
12
- [ 四 ConcurrentLinkedQueue] ( #四-concurrentlinkedqueue )
13
13
- [ 五 BlockingQueue] ( #五-blockingqueue )
14
14
- [ 5.1 BlockingQueue 简单介绍] ( #51-blockingqueue-简单介绍 )
@@ -56,17 +56,17 @@ implements List<E>, RandomAccess, Cloneable, Serializable
56
56
57
57
在很多应用场景中,读操作可能会远远大于写操作。由于读操作根本不会修改原有的数据,因此对于每次读取都进行加锁其实是一种资源浪费。我们应该允许多个线程同时访问List 的内部数据,毕竟读取操作是安全的。
58
58
59
- 这和我们之前在多线程章节讲过 `ReentrantReadWriteLock ` 读写锁的思想非常类似,也就是读读共享、写写互斥、读写互斥、写读互斥。JDK 中提供了 `CopyOnWriteArravList ` 类比相比于在读写锁的思想又更进一步。为了将读取的性能发挥到极致,`CopyOnWriteArravList ` 读取是完全不用加锁的,并且更厉害的是:写入也不会阻塞读取操作。只有写入和写入之间需要进行同步等待。这样一来,读操作的性能就会大幅度提升。**那它是怎么做的呢?**
59
+ 这和我们之前在多线程章节讲过 `ReentrantReadWriteLock ` 读写锁的思想非常类似,也就是读读共享、写写互斥、读写互斥、写读互斥。JDK 中提供了 `CopyOnWriteArrayList ` 类比相比于在读写锁的思想又更进一步。为了将读取的性能发挥到极致,`CopyOnWriteArrayList ` 读取是完全不用加锁的,并且更厉害的是:写入也不会阻塞读取操作。只有写入和写入之间需要进行同步等待。这样一来,读操作的性能就会大幅度提升。**那它是怎么做的呢?**
60
60
61
- ### 3.2 CopyOnWriteArravList 是如何做到的?
61
+ ### 3.2 CopyOnWriteArrayList 是如何做到的?
62
62
63
- `CopyOnWriteArravList ` 类的所有可变操作(add,set等等)都是通过创建底层数组的新副本来实现的。当 List 需要被修改的时候,我并不修改原有内容,而是对原有数据进行一次复制,将修改的内容写入副本。写完之后,再将修改完的副本替换原来的数据,这样就可以保证写操作不会影响读操作了。
63
+ `CopyOnWriteArrayList ` 类的所有可变操作(add,set等等)都是通过创建底层数组的新副本来实现的。当 List 需要被修改的时候,我并不修改原有内容,而是对原有数据进行一次复制,将修改的内容写入副本。写完之后,再将修改完的副本替换原来的数据,这样就可以保证写操作不会影响读操作了。
64
64
65
- 从 `CopyOnWriteArravList ` 的名字就能看出`CopyOnWriteArravList ` 是满足`CopyOnWrite ` 的ArrayList ,所谓`CopyOnWrite ` 也就是说:在计算机,如果你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉了。
65
+ 从 `CopyOnWriteArrayList ` 的名字就能看出`CopyOnWriteArrayList ` 是满足`CopyOnWrite ` 的ArrayList ,所谓`CopyOnWrite ` 也就是说:在计算机,如果你想要对一块内存进行修改时,我们不在原有内存块中进行写操作,而是将内存拷贝一份,在新的内存中进行写操作,写完之后呢,就将指向原来内存指针指向新的内存,原来的内存就可以被回收掉了。
66
66
67
- ### 3.3 CopyOnWriteArravList 读取和写入源码简单分析
67
+ ### 3.3 CopyOnWriteArrayList 读取和写入源码简单分析
68
68
69
- #### 3.3.1 CopyOnWriteArravList 读取操作的实现
69
+ #### 3.3.1 CopyOnWriteArrayList 读取操作的实现
70
70
71
71
读取操作没有任何同步控制和锁操作,理由就是内部数组 array 不会发生修改,只会被另外一个 array 替换,因此可以保证数据安全。
72
72
@@ -86,9 +86,9 @@ implements List<E>, RandomAccess, Cloneable, Serializable
86
86
87
87
```
88
88
89
- #### 3.3.2 CopyOnWriteArravList 写入操作的实现
89
+ #### 3.3.2 CopyOnWriteArrayList 写入操作的实现
90
90
91
- CopyOnWriteArravList 写入操作 add() 方法在添加集合的时候加了锁,保证了同步,避免了多线程写的时候会 copy 出多个副本出来。
91
+ CopyOnWriteArrayList 写入操作 add() 方法在添加集合的时候加了锁,保证了同步,避免了多线程写的时候会 copy 出多个副本出来。
92
92
93
93
``` java
94
94
/**
0 commit comments