Collections.synchronizedList引发的线程安全问题
有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类
似 private static List<Task> taskQueue = Collections.synchronizedList(new
LinkedList<Task>());的方法可以得到本身不是线程安全的容易的线程安全的状态,但是要注意
的是线程安全仅仅指的是如果直接使用它提供的函数,比如:queue.add(obj); 或者
queue.poll(obj);,这样我们自己不需要做任何同步。
但如果是非原子操作,比如:
1. if(!queue.isEmpty()) {
2. queue.poll(obj);
3. }
我们很难保证,在调用了isEmpty()之后,poll()之前,这个queue没有被其他线程修改。
所以对于这种情况,我们还是需要自己同步:
1. synchronized(queue) {
2. if(!queue.isEmpty()) {
3. queue.poll(obj);
4. }
5. }
对于Collections.synchronizedList(new LinkedList<Task>()),
在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步:
List list = Collections.synchronizedList(new ArrayList()); ... synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext())
foo(i.next()); }
http://blog.sina.com.cn/s/blog_5efa3473010129pw.html
相关推荐
标题中的"Collections.synchronizedList"是指Java集合框架中的一个静态工厂方法,用于将任何List转换为线程安全的List。这个方法是Java中实现多线程环境下的集合操作的重要工具,确保在并发访问时数据的一致性和完整...
在Java编程中,线程安全性和不安全性是并发编程中非常关键的概念。...在面对线程安全问题时,我们可以借助如`synchronized`关键字、`Collections.synchronizedList`等工具来增强集合的线程安全性。
2. 使用`Collections.synchronizedList`:这个静态方法可以将给定的`ArrayList`转换为线程安全的列表。在内部,它通过在方法调用上添加`synchronized`关键字来实现同步。这提供了线程安全的访问,但仍然需要谨慎处理...
这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法转换得到的。例如,`Collections.synchronizedList`和`Collections.synchronizedMap`。同步集合在每个方法上加锁,确保...
- 使用`Collections.synchronizedList()`方法包装集合。 - 使用并发集合类(如`ConcurrentHashMap`, `CopyOnWriteArrayList`)。 #### 八、高级主题 - **泛型与类型安全**:使用泛型确保类型安全,避免运行时的`...
3. 转换线程安全集合:Collections.synchronizedxxx() 方法可以将线程不安全的集合转换成线程安全集合。 例如: List list = new ArrayList(); list.add(2); list.add(1); list.add(3); List integers = ...
在实际开发中,如果对线程安全有需求,可以考虑使用Collections.synchronizedList()方法将ArrayList转换为线程安全的列表,或者使用CopyOnWriteArrayList,这是一个更适合并发读写场景的线程安全实现。而如果在单...
2. **线程安全的 List**:`List list = Collections.synchronizedList(al);` 这行代码将 `ArrayList` 转换为线程安全的 `List`。这是因为 `ArrayList` 不是线程安全的,而在多线程环境中,如果多个线程同时访问并...
`SynchronizedList`和`Vector`都是提供线程安全保证的列表实现,但它们在实现方式和性能上存在一些差异。下面我们将深入探讨这两个类的区别。 1. **实现方式** - `Vector` 是 `java.util` 包中的一个类,它直接...
为了保证多线程环境下对集合的安全访问,`Collections`提供了创建同步集合的方法: - `Collections.synchronizedCollection(Collection c)`: 创建同步集合。 - `Collections.synchronizedList(List l)`: 创建同步...
java.util.ArrayList非线程安全的类,可用Collections.synchronizedList()进行包装 List list = Collections.synchronizedList(new ArrayList()); CopyOnWriteArrayList线程安全的类,适用于读操作频繁的场景。 Gua
因此,如果需要在多线程环境下使用List,应该选择Vector或使用Collections.synchronizedList()方法来将List转换为线程安全的集合。 3.List是有序的吗? 是的,List是有序的。List中元素的顺序是固定的,可以使用...
此外,ArrayList不是线程安全的,如果在多线程环境中使用,需要通过Collections.synchronizedList方法使ArrayList同步。 二、ArrayList源码分析 1. 底层实现:ArrayList的内部字段`elementData`是一个transient的...
例如,Java提供了ConcurrentHashMap、ArrayList的线程安全版本Collections.synchronizedList()等,它们内部实现了线程同步,保证了并发环境下的安全性。 此外,线程池是多线程应用中的最佳实践,它可以有效地管理...
为了在多线程环境下安全地使用ArrayList,可以借助`Collections.synchronizedList`方法将其包装成线程安全的列表。例如: ```java List, Object>> test = Collections.synchronizedList(new ArrayList, Object>>())...
5. **线程安全**:`Collections.synchronizedList(List<T> list)`可以将一个非同步的`List`转换为线程安全的。 6. **集合拷贝**:`Collections.copy(List<T> dest, List<? extends T> src)`可以将源列表中的元素...
线程安全的集合类,如Vector、Collections.synchronizedList()、ConcurrentHashMap等,也是Java多线程编程中常用的数据结构。它们内部实现了同步机制,可以在多线程环境下安全地访问和修改数据。 此外,Java的并发...
- `synchronizedList(List<T> list)`: 返回给定列表的线程安全版本,通过包装器类实现了线程同步。这样多线程环境下访问列表时就不会出现数据不一致的问题。 - `synchronizedSet(Set<T> set)`: 类似地,返回给定...