我们知道List, Set, HashMap都是非线程安全的,有时我们希望它们是线程安全的,如何来解决这个问题呢?
在Collections中有方法使它们变成线程安全的。
public static <T> List<T> synchronizedList(List<T> list)
public static <T> Set<T> synchronizedSet(Set<T> s)
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
其实实现线程安全还是比较简单的,还记得Hashtable中如何实现线程安全的吗?就是加一个syschronized同步方法。那么,现在转线程安全,上面的方法是如何做得到的呢?
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
static final long serialVersionUID = -7754090372962971524L;
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;
}
public boolean equals(Object o) {
synchronized(mutex) {return list.equals(o);}
}
public int hashCode() {
synchronized(mutex) {return list.hashCode();}
}
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);}
}
}
看到没有,它用的是同步代码块。
分享到:
相关推荐
这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法转换得到的。例如,`Collections.synchronizedList`和`Collections.synchronizedMap`。同步集合在每个方法上加锁,确保...
Java 集合框架的设计者 Bloch Joshua 在他著名的 《Java 高效编程》一书中对 Java 线程安全的等级做出了相对精确的定义:非可变、线程安全、条件线程安全、线程兼容和线程不友好。 本文将结合上述 Bloch 关于线程...
合理选择线程安全的集合类,或者使用同步机制对非线程安全的集合进行封装,是确保程序正确性的关键步骤。此外,Java并发库(如`ConcurrentHashMap`、`CopyOnWriteArrayList`等)提供了更高效且线程安全的解决方案,...
- 原子类提供了线程安全的整型、长整型等基本类型操作,避免了使用锁带来的性能开销。 #### 十七、Java线程:新特征-障碍器 - **障碍器**: - `CyclicBarrier` 和 `CountDownLatch` 是两种常用的屏障类,用于...
Java线程安全是多线程编程中的一个关键概念,它涉及到在并发环境下如何正确地管理共享资源,确保程序的正确性和一致性。以下是对Java线程安全的深入总结: ### 一、线程安全的定义 线程安全是指当多个线程访问同一...
总之,理解并掌握Java中的线程安全问题及其解决方案是每个Java开发者必备的技能,这不仅可以确保程序的正确性,还能有效利用多核处理器,提升系统性能。在阅读源码时,也要注意观察作者如何处理线程安全,这对于提升...
Java提供了多种机制来保证线程安全,比如使用synchronized关键字来同步方法或代码块,实现线程之间的同步。当一个线程试图进入一个已经被另一个线程持有的同步代码块时,它将进入阻塞状态,直到同步代码块的执行线程...
8. **并发集合类**:Java提供了并发安全的集合类,如`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等,它们内部实现了线程安全的算法,可以在多线程环境下高效使用。 9. **线程中断**:`interrupt...
总结来说,理解Java中的线程安全与不安全集合是非常重要的,这有助于在设计并发程序时选择合适的数据结构和操作方式,以确保程序的正确性和性能。在面对线程安全问题时,我们可以借助如`synchronized`关键字、`...
总结起来,“JAVA多线程编程技术PDF”涵盖了多线程的基本概念、同步机制、线程通信、死锁避免、线程池以及线程安全的集合类等内容。通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发...
1. synchronized关键字:用于保证线程安全,它可以修饰方法或代码块,实现对共享资源的互斥访问。 2. volatile关键字:保证变量的可见性和有序性,但不保证原子性。 3. Lock接口与ReentrantLock类:提供了比...
在处理查询结果的合并或存储时,尤其需要注意线程安全问题。 ### 7. 错误处理与异常传播 在多线程环境中,捕获和处理异常特别重要。通常,我们需要确保线程池的`shutdownNow()`方法可以在遇到错误时停止所有任务,...
8. **线程安全与线程不安全**:理解哪些操作是线程安全的,哪些不是,以及如何使非线程安全的操作变得安全,是多线程编程的重要课题。线程安全的类如Atomic系列类和Collections.synchronizedXXX()方法可以帮助我们...
以上只是Java多线程面试中可能会遇到的一部分问题,实际的59题集合可能涵盖更多细节和深度,包括线程安全的类、线程通信的高级技术、并发设计模式等。掌握这些知识点,不仅有助于应对面试,更能提高在实际开发中处理...
4. 使用并发集合:Java并发包(java.util.concurrent)提供了线程安全的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了线程同步,无需额外的同步控制。 5. 原子操作(Atomic):AtomicInteger...
为了解决这个问题,可以在迭代器中使用`fail-fast`策略或者使用`CopyOnWriteArrayList`这类线程安全的集合类作为内部实现。 3. **效率**:虽然`synchronized`关键字提供了线程安全,但过多的同步可能会导致性能下降...
Java 集合的线程安全详解 Java 集合的线程安全是指在多线程环境中,集合操作的安全性。 Java 中有多种集合类,如 Vector、ArrayList、LinkedList、HashTable、HashMap、HashSet 等,这些集合类在多线程环境中的安全...