1.arraylist为ä»ä¹çº¿ç¨ä¸å®å
¨
2.线ç¨å®å
¨çlistä¹synchronizedListåCopyOnWriteArrayList
3.java中Arraylist是源码干什么的?怎么用?
4.fail-fast å fail-safe
5.关于 List 的线程不安全
6.LinkedList(详细讲解)
arraylist为ä»ä¹çº¿ç¨ä¸å®å ¨
é¦å 说ä¸ä¸ä»ä¹æ¯çº¿ç¨ä¸å®å ¨ï¼çº¿ç¨å®å ¨å°±æ¯å¤çº¿ç¨è®¿é®æ¶ï¼éç¨äºå éæºå¶ï¼å½ä¸ä¸ªçº¿ç¨è®¿é®è¯¥ç±»çæ个æ°æ®æ¶ï¼è¿è¡ä¿æ¤ï¼å ¶ä»çº¿ç¨ä¸è½è¿è¡è®¿é®ç´å°è¯¥çº¿ç¨è¯»åå®ï¼å ¶ä»çº¿ç¨æå¯ä½¿ç¨ãä¸ä¼åºç°æ°æ®ä¸ä¸è´æè æ°æ®æ±¡æã线ç¨ä¸å®å ¨å°±æ¯ä¸æä¾æ°æ®è®¿é®ä¿æ¤ï¼æå¯è½åºç°å¤ä¸ªçº¿ç¨å åæ´æ¹æ°æ®é ææå¾å°çæ°æ®æ¯èæ°æ®ã å¦å¾ï¼Listæ¥å£ä¸é¢æ两个å®ç°ï¼ä¸ä¸ªæ¯ArrayListï¼å¦å¤ä¸ä¸ªæ¯vectorã ä»æºç çè§åº¦æ¥çï¼å 为Vectorçæ¹æ³åå äºï¼synchronized å ³é®åï¼ä¹å°±æ¯åæ¥çææï¼sunå ¬å¸å¸æVectoræ¯çº¿ç¨å®å ¨çï¼èå¸æarraylistæ¯é«æçï¼ç¼ºç¹å°±æ¯å¦å¤çä¼ç¹ã 说ä¸åçï¼ç¾åº¦çï¼å¾å¥½ç解ï¼ï¼ ä¸ä¸ª ArrayList ï¼å¨æ·»å ä¸ä¸ªå ç´ çæ¶åï¼å®å¯è½ä¼æ两æ¥æ¥å®æï¼
1. å¨ Items[Size] çä½ç½®åæ¾æ¤å ç´ ï¼
2. å¢å¤§ Size çå¼ã
å¨å线ç¨è¿è¡çæ åµä¸ï¼å¦æ Size = 0ï¼æ·»å ä¸ä¸ªå ç´ åï¼æ¤å ç´ å¨ä½ç½® 0ï¼èä¸ Size=1ï¼
èå¦ææ¯å¨å¤çº¿ç¨æ åµä¸ï¼æ¯å¦æ两个线ç¨ï¼çº¿ç¨ A å å°å ç´ åæ¾å¨ä½ç½® 0ãä½æ¯æ¤æ¶ CPU è°åº¦çº¿ç¨Aæåï¼çº¿ç¨ B å¾å°è¿è¡çæºä¼ã线ç¨Bä¹åæ¤ ArrayList æ·»å å ç´ ï¼å 为æ¤æ¶ Size ä»ç¶çäº 0 ï¼æ³¨æå¦ï¼æ们å设çæ¯æ·»å ä¸ä¸ªå ç´ æ¯è¦ä¸¤ä¸ªæ¥éª¤å¦ï¼è线ç¨Aä» ä» å®æäºæ¥éª¤1ï¼ï¼æ以线ç¨Bä¹å°å ç´ åæ¾å¨ä½ç½®0ãç¶å线ç¨Aå线ç¨Bé½ç»§ç»è¿è¡ï¼é½å¢å Size çå¼ã
é£å¥½ï¼ç°å¨æ们æ¥çç ArrayList çæ åµï¼å ç´ å®é ä¸åªæä¸ä¸ªï¼åæ¾å¨ä½ç½® 0ï¼è Size å´çäº 2ãè¿å°±æ¯â线ç¨ä¸å®å ¨âäºã
示ä¾ç¨åºï¼
package test;
import java.util.ArrayList;
import java.util.List;
public class ArrayListInThread implements Runnable {
List<String> list1 = new ArrayList<String>();// not thread safe
// List<String> list1 = Collections.synchronizedList(new ArrayList<String>());// thread safe
public void run() {
try {
Thread.sleep((int)(Math.random() * 2));
}
catch (InterruptedException e) {
e.printStackTrace();
}
list1.add(Thread.currentThread().getName());
}
public static void main(String[] args) throws InterruptedException {
ThreadGroup group = new ThreadGroup("mygroup");
ArrayListInThread t = new ArrayListInThread();
for (int i = 0; i < ; i++) {
Thread th = new Thread(group, t, String.valueOf(i));
th.start();
}
while (group.activeCount() > 0) {
Thread.sleep();
}
System.out.println();
System.out.println(t.list1.size()); // it should be if thread safe collection is used.
}
}
线ç¨å®å ¨çlistä¹synchronizedListåCopyOnWriteArrayList
å¨ä¸ç¯æç« ä¸æ们已ç»ä»ç»äºå ¶ä»çä¸äºlistéåï¼å¦ArrayListãlinkedlistçãä¸æ¸ æ¥çå¯ä»¥çä¸ä¸ç¯æç« /p/ab5bf7ä½æ¯åArrayListè¿äºä¼åºç°çº¿ç¨ä¸å®å ¨çé®é¢ï¼æ们该ææ ·è§£å³å¢ï¼æ¥ä¸æ¥å°±æ¯è¦ä»ç»æ们线ç¨å®å ¨çlistéåsynchronizedListåCopyOnWriteArrayListã
synchronizedListç使ç¨æ¹å¼ï¼
ä»ä¸é¢ç使ç¨æ¹å¼ä¸æ们å¯ä»¥çåºï¼synchronizedListæ¯å°Listéåä½ä¸ºåæ°æ¥å建çsynchronizedListéåã
synchronizedList为ä»ä¹æ¯çº¿ç¨å®å ¨çå¢ï¼
æ们å æ¥çä¸ä¸ä»çæºç ï¼
æ们大æ¦è´´äºä¸äºå¸¸ç¨æ¹æ³çæºç ï¼ä»ä¸é¢çæºç ä¸æ们å¯ä»¥çåºï¼å ¶å®synchronizedList线ç¨å®å ¨çåå æ¯å 为å®å ä¹å¨æ¯ä¸ªæ¹æ³ä¸é½ä½¿ç¨äºsynchronizedåæ¥éã
synchronizedListå®æ¹ææ¡£ä¸ç»åºç使ç¨æ¹å¼æ¯ä»¥ä¸æ¹å¼ï¼
å¨ä»¥ä¸æºç ä¸æ们å¯ä»¥çåºï¼å®æ¹ææ¡£æ¯å»ºè®®æ们å¨éåçæ¶åå éå¤ççãä½æ¯æ¢ç¶å é¨æ¹æ³ä»¥åå äºéï¼ä¸ºä»ä¹å¨éåçæ¶åè¿éè¦å éå¢ï¼æ们æ¥çä¸ä¸å®çéåæ¹æ³ï¼
ä»ä»¥ä¸æºç å¯ä»¥çåºï¼è½ç¶å é¨æ¹æ³ä¸å¤§é¨åé½å·²ç»å äºéï¼ä½æ¯iteratoræ¹æ³å´æ²¡æå éå¤çãé£ä¹å¦ææ们å¨éåçæ¶åä¸å éä¼å¯¼è´ä»ä¹é®é¢å¢ï¼
è¯æ³æ们å¨éåçæ¶åï¼ä¸å éçæ åµä¸ï¼å¦ææ¤æ¶æå ¶ä»çº¿ç¨å¯¹æ¤éåè¿è¡addæè removeæä½ï¼é£ä¹è¿ä¸ªæ¶åå°±ä¼å¯¼è´æ°æ®ä¸¢å¤±æè æ¯èæ°æ®çé®é¢ï¼æ以å¦ææ们对æ°æ®çè¦æ±è¾é«ï¼æ³è¦é¿å è¿æ¹é¢é®é¢çè¯ï¼å¨éåçæ¶åä¹éè¦å éè¿è¡å¤çã
ä½æ¯æ¢ç¶æ¯ä½¿ç¨synchronizedå éè¿è¡å¤ççï¼é£è¯å®é¿å ä¸äºä¸äºéå¼éãæ没ææçæ´å¥½çæ¹å¼å¢ï¼é£å°±æ¯æ们å¦ä¸ä¸ªä¸»è¦ç并åéåCopyOnWriteArrayListã
CopyOnWriteArrayListæ¯å¨æ§è¡ä¿®æ¹æä½æ¶ï¼copyä¸ä»½æ°çæ°ç»è¿è¡ç¸å ³çæä½ï¼å¨æ§è¡å®ä¿®æ¹æä½åå°åæ¥éåæåæ°çéåæ¥å®æä¿®æ¹æä½ãå ·ä½æºç å¦ä¸ï¼
ä»ä»¥ä¸æºç æ们å¯ä»¥çåºï¼å®å¨æ§è¡addæ¹æ³åremoveæ¹æ³çæ¶åï¼åå«å建äºä¸ä¸ªå½åæ°ç»é¿åº¦+1å-1çæ°ç»ï¼å°æ°æ®copyå°æ°æ°ç»ä¸ï¼ç¶åæ§è¡ä¿®æ¹æä½ãä¿®æ¹å®ä¹åè°ç¨setArrayæ¹æ³æ¥æåæ°çæ°ç»ãå¨æ´ä¸ªè¿ç¨ä¸æ¯ä½¿ç¨ReentrantLockå¯éå ¥éæ¥ä¿è¯ä¸ä¼æå¤ä¸ªçº¿ç¨åæ¶copyä¸ä¸ªæ°çæ°ç»ï¼ä»èé æçæ··ä¹±ã并ä¸ä½¿ç¨volatile修饰æ°ç»æ¥ä¿è¯ä¿®æ¹åçå¯è§æ§ã读åæä½äºä¸å½±åï¼æ以å¨æ´ä¸ªè¿ç¨ä¸æ´ä¸ªæçæ¯é常é«çã
synchronizedListéå对æ°æ®è¦æ±è¾é«çæ åµï¼ä½æ¯å 为读åå ¨é½å éï¼æææçè¾ä½ã
CopyOnWriteArrayListæçè¾é«ï¼éå读å¤åå°çåºæ¯ï¼å 为å¨è¯»çæ¶å读çæ¯æ§éåï¼æ以å®çå®æ¶æ§ä¸é«ã
java中Arraylist是干什么的?怎么用?
java中的ArrayList就是传说中的动态数组,用MSDN中的源码说法,就是源码Array的复杂版本。它提供了如下一些好处:动态的源码增加和减少元素实现了ICollection和IList接口灵活的设置数组的大小 。
ArrayList 的源码用法:
ArrayList List = new ArrayList(); for( int
i=0;i<;i++ ) //
给数组增加个Int元素 List.Add(i); //..
程序做一些处理
List.RemoveAt(5);//
将第6个元素移除 for( int i=0;i<3;i++ ) //
再增加3个元素
List.Add(i+); Int[] values =
(Int[])List.ToArray(typeof(Int));//
返回ArrayList包含的数组 。
扩展资料:
Arraylist的源码源码资本内推码定义:
List 接口的大小可变数组的实现,位于API文档的源码java.util.ArrayList<E>。
实现了所有可选列表操作,源码并允许包括 null 在内的源码所有元素。
除了实现 List 接口外,源码此类还提供一些方法来操作内部用来存储列表的源码数组的大小。(此类大致上等同于 Vector 类,源码除了此类是源码不同步的。)
size、源码创业His系统源码isEmpty、源码get、set、iterator 和 listIterator 操作都以固定时间运行。
add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。
其他所有操作都以线性时间运行(大体上讲)。
与用于 LinkedList 实现的常数因子相比,此实现的常数因子较低。
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。
它总是网址引导页源码至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。
并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单
在添加大量元素前,应用程序可以使用
ensureCapacity 操作来增加 ArrayList
实例的容量。这可以减少递增式再分配的数量。
注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList
实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。
(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的nft源码免费下载大小;仅仅设置元素的值不是结构上的修改。)
这一般通过对自然封装该列表的对象进行同步操作来完成。
如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...));
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的。
在创建迭代器之后,除非通过迭代器自身的
remove 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出
ConcurrentModificationException。
因此,面对并发的修改,迭代器很快就会完全失败,而不是出纳记账软件源码冒着在将来某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证。
因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出
ConcurrentModificationException。
因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测
bug。
参考资料:
fail-fast å fail-safe
å½ä¸ä¸ªæå¤ä¸ªçº¿ç¨æ£å¨éåä¸ä¸ªéåï¼Collectionï¼ï¼æ¤æ¶å¦ä¸ä¸ªçº¿ç¨ä¿®æ¹äºè¿ä¸ªéåï¼æ·»å ï¼å é¤æä¿®æ¹ï¼å°±ç§°ä¸ºå¹¶åä¿®æ¹ã.
å®æ¹ææ¡£å¨HashMapéåä¸å¯¹fail-fastç解é
ææå°±æ¯ï¼è¿ä¸ªè¿ä»£å¨ï¼Iteratorï¼è¢«å建åï¼é¤äºè¿ä»£å¨èªèº«çæ¹æ³ï¼removeï¼å¯ä»¥æ¹åéåçç»æï¼å ¶ä»æ åµæ¹åäºéåçç»æï¼é½å°è·åºä¸ä¸ª ConcurrentModificationException å¼å¸¸ã
ä»ä¸é¢çæºç ï¼å¯ä»¥åç°è¿ä»£å¨å¨æ§è¡ next() çæ¹æ³çæ¶åï¼é½ä¼è°ç¨ä¸ä¸ªæ¹æ³ checkForComodification() ï¼èè¿ä¸ªæ¹æ³å°±æ¯æ£æ¥ modCount æ¯å¦çäº expectedModCount ï¼å¦æä¸çäºå°±æåº ConcurrentModificationException å¼å¸¸ã
expectedModCount è¿ä¸ªåéçå¼å¨å¯¹è±¡è¢«å建çæ¶åå°±èµäºäºä¸ä¸ªåºå®çå¼ modCount ï¼è¿ä¸ªå¼æ¯ä¸åçï¼å½è¿ä»£å¨éåå ç´ çæ¶åï¼å¦æ modCount åçäºæ¹åï¼é£å°±ä¼æåºå¼å¸¸ã
æ¥çæºç å¯ä»¥åç°ï¼å½å¯¹éåè¿è¡å¢å æä½é½ä¼ modCount++ ã
æ以å½æ们对éåçå ç´ ç个æ°ååºä¿®æ¹ï¼æ·»å ãå é¤ï¼çæ¶åï¼ modCount çå¼å°±ä¼åçæ¹åï¼ä½å¯¹å ç´ è¿è¡ä¿®æ¹åä¸ä¼æ¹å modCount çå¼ã
ä¿è¯å¨å¹¶åä¿®æ¹çæ¶åï¼å¯¹ææä¼å½±åå° modCount åçæ¹åçå°æ¹ï¼å ä¸åæ¥éï¼synchronizedï¼ï¼æè 使ç¨åæ¥ç±»å®¹å¨ Collections.synchronizedList ã
.
fail-safeï¼ä»»ä½å¯¹éåç»æçä¿®æ¹é½ä¼å¨ä¸ä¸ªå¤å¶çéåä¸è¿è¡ä¿®æ¹ï¼å æ¤ä¸ä¼æåº ConcurrentModificationException å¼å¸¸ã
两个é®é¢ï¼
ä»æºç å¯ä»¥çå°ï¼å¨å¯¹éåè¿è¡æ·»å åå é¤å ç´ çæ¶åé½è¿è¡å éï¼ç¶å让å½åä¸æ çå ç´ æ·»å æå é¤ï¼æåå°åæ°ç»çå°åæåæ°çæ°ç»ï¼å®æå¤å¶ãè¿éæ¶åå°CopyOnWriteæºå¶ã
è¿æ ·åä¸ä¼åºç° fail-fast ï¼ä½æ¯å¯¹éåè¿è¡å¢å æä½é½éè¦å éï¼å½±åæçãåæ¶å¢å 对象容éå¯è½ä¼å¯¼è´ OOM ã
å¨éåè¿ç¨ä¸ï¼éåçå ç´ å¹¶ä¸ä¸å®æ¯æç»çå ç´ éåï¼æ以åªè½ä¿è¯æç»ä¸è´æ§ã
关于 List 的线程不安全
讨论 List 数据结构在多线程环境下的安全性问题。首先,答案是否定的,因为 List 类在 Java 中并未提供线程安全的实现,以牺牲一致性保证了效率。以 ArrayList 为例,其核心方法 add(E e) 未加锁,如源码所示:
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
为提升性能和并发性,未对并发操作进行同步处理,从而可能导致并发修改异常(ConcurrentModificationException)。通过在模拟代码中执行并发添加操作即可复现该异常。
针对此问题,有以下几种解决策略:
1. **使用 Vector**:Vector 类提供了线程安全的 add 方法,通过 synchronized 关键字对方法进行同步,确保并发安全。但其性能表现低于无锁的实现,特别是在高并发场景下。
2. **利用 Collections.synchronizedList()**:此方法通过将非线程安全的 List 实例包装为同步的 List 实例,提供了一个简单的解决方式。通过以下代码即可实现:
java
List list = Collections.synchronizedList(new ArrayList());
3. **采用 CopyOnWriteArrayList**:此类在添加元素时不会修改原有数据结构,而是在添加后创建新的数据结构副本。核心源码揭示了这一实现机制,具体为使用 ReentrantLock 上锁,复制现有数组,添加元素至新数组,并最终释放锁。
综上所述,解决 List 类线程不安全问题的常见策略包括使用 Vector、Collections.synchronizedList() 方法或 CopyOnWriteArrayList 类。每种方法都有其适用场景和性能考量,开发者应根据具体需求选择合适的解决方案。
LinkedList(详细讲解)
LinkedList是Java中实现List接口和Deque接口的双向链表,其独特结构使其支持高效的插入和删除操作,同时具备队列特性。非线程安全的LinkedList可通过Collections.synchronizedList方法进行同步处理。
内部结构由Node节点构成,包含前驱节点、节点值和后继节点。类提供了多种操作方法,如空构造、基于集合创建链表、添加元素(add、addFirst、addLast)、根据索引获取或删除数据(get、remove、indexOf等)。在处理特定情况时,如获取头节点,getFirst()和element()会抛出异常,而getLast()和peekLast()则返回null。删除节点时,removeLast()和pollLast()行为不同,前者在链表为空时抛出异常,后者则返回null。
总结,LinkedList提供了丰富的操作手段,适用于需要频繁插入和删除元素的场景,但需要注意其线程安全问题。通过学习其源码,我们可以深入了解其实现机制和使用方法。
JavaçListå¦ä½å®ç°çº¿ç¨å®å ¨ï¼
JavaçListå¦ä½å®ç°çº¿ç¨å®å ¨ï¼Collections.synchronizedList(names);æçæé«ï¼çº¿ç¨å®å ¨
JavaçListæ¯æ们平æ¶å¾å¸¸ç¨çéåï¼çº¿ç¨å®å ¨å¯¹äºé«å¹¶åçåºæ¯ä¹ååçéè¦ï¼é£ä¹Listå¦ä½æè½å®ç°çº¿ç¨å®å ¨å¢ ï¼
å é
é¦å 大家ä¼æ³å°ç¨Vectorï¼è¿éæ们就ä¸è®¨è®ºäºï¼é¦å 讨论çæ¯å éï¼ä¾å¦ä¸é¢ç代ç
public class Synchronized{
private List<String> names = new LinkedList<>();
public synchronized void addName(String name ){
names.add("abc");
}
public String getName(Integer index){
Lock lock =new ReentrantLock();
lock.lock();
try {
return names.get(index);
}catch (Exception e){
e.printStackTrace();
}
finally {
lock.unlock();
}
return null;
}
}
synchronizedä¸å ï¼æè 使ç¨lock å¯ä»¥å®ç°çº¿ç¨å®å ¨ï¼ä½æ¯è¿æ ·çListè¦æ¯å¾å¤ä¸ªï¼ä»£ç éä¼å¤§å¤§å¢å ã
javaèªå¸¦ç±»
å¨javaä¸ææ¾å°èªå¸¦æ两ç§æ¹æ³
CopyOnWriteArrayList
CopyOnWrite åå ¥æ¶å¤å¶ï¼å®ä½¿ä¸ä¸ªListåæ¥çæ¿ä»£åï¼é常æ åµä¸æä¾äºæ´å¥½ç并åæ§ï¼å¹¶ä¸é¿å äºåè¿ä»£æ¶å对容å¨çå éåå¤å¶ãé常æ´éåç¨äºè¿ä»£ï¼å¨å¤æå ¥çæ åµä¸ç±äºå¤æ¬¡çå¤å¶æ§è½ä¼ä¸å®çä¸éã
ä¸é¢æ¯addæ¹æ³çæºä»£ç
public boolean add(E e) {
final ReentrantLock lock = this.lock; // å é åªå 许è·å¾éç线ç¨è®¿é®
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
// å建个é¿åº¦å 1çæ°ç»å¹¶å¤å¶è¿å»
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e; // èµå¼
setArray(newElements); // 设置å é¨çæ°ç»
return true;
} finally {
lock.unlock();
}
}
Collections.synchronizedList
Collectionsä¸æ许å¤è¿ä¸ªç³»åçæ¹æ³ä¾å¦
主è¦æ¯å©ç¨äºè£ 饰è 模å¼å¯¹ä¼ å ¥çéåè¿è¡è°ç¨ Collotionsä¸æå é¨ç±»SynchronizedList
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
private static final long serialVersionUID = -L;
final List<E> list;
SynchronizedList(List<E> list) {
super(list);
this.list = list;
}
public E get(int index) {
synchronized (mutex) { return list.get(index);}
}
public E set(int index, E element) {
synchronized (mutex) { return list.set(index, element);}
}
public void add(int index, E element) {
synchronized (mutex) { list.add(index, element);}
}
public E remove(int index) {
synchronized (mutex) { return list.remove(index);}
}
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
è¿éä¸é¢çmutexå°±æ¯éç对象 å¨æ建æ¶åå¯ä»¥æå®éç对象 主è¦ä½¿ç¨synchronizeå ³é®åå®ç°çº¿ç¨å®å ¨
/
*** @serial include
*/
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
private static final long serialVersionUID = -L;
final List<E> list;
SynchronizedList(List<E> list) {
super(list);
this.list = list;
}
SynchronizedList(List<E> list, Object mutex) {
super(list, mutex);
this.list = list;
}
è¿éåªæ¯å举SynchronizedList ï¼å ¶ä»ç±»ç±»ä¼¼ï¼å¯ä»¥çä¸æºç äºè§£ä¸ã
æµè¯
public class Main {
public static void main(String[] args) {
List<String> names = new LinkedList<>();
names.add("sub");
names.add("jobs");
// åæ¥æ¹æ³1 å é¨ä½¿ç¨lock
long a = System.currentTimeMillis();
List<String> strings = new CopyOnWriteArrayList<>(names);
for (int i = 0; i < ; i++) {
strings.add("param1");
}
long b = System.currentTimeMillis();
// åæ¥æ¹æ³2 è£ é¥°å¨æ¨¡å¼ä½¿ç¨ synchronized
List<String> synchronizedList = Collections.synchronizedList(names);
for (int i = 0; i < ; i++) {
synchronizedList.add("param2");
}
long c = System.currentTimeMillis();
System.out.println("CopyOnWriteArrayList time == "+(b-a));
System.out.println("Collections.synchronizedList time == "+(c-b));
}
}
两è å é¨ä½¿ç¨çæ¹æ³é½ä¸ä¸æ ·ï¼CopyOnWriteArrayListå é¨æ¯ä½¿ç¨lockè¿è¡å é解éå®æå线ç¨è®¿é®ï¼synchronizedList使ç¨çæ¯synchronize
è¿è¡äºæ¬¡æ·»å åæ¶é´å¯¹æ¯å¦ä¸ï¼
å¯ä»¥çåºæ¥è¿æ¯ä½¿ç¨äºsynchronizeçéåå·¥å ·ç±»å¨æ·»å æ¹é¢æ´å å¿«ä¸äºï¼å ¶ä»æ¹æ³è¿éç¯å¹ å ³ç³»å°±ä¸æµè¯äºï¼å¤§å®¶æå ´è¶£å»è¯ä¸ä¸ã