线程安全集合类

使用线程不安全的集合在多线程下会发生异常
java.util.ConcurrentModificationException
例如arraylist hashmap

Arraylist

a.可以使用线程安全的相关集合类
    List<String> list = Collections.synchronizedList(new ArrayList<>());
    Map<Object, Object> objectObjectMap = Collections.synchronizedMap(new HashMap<>());
b.使用 List<String> list = new CopyOnWriteArrayList<>(); 写时复制

copyonwrit容器即在写时复制的容器。往容器中添加元素的时候,不直接往当前容器中Object[]中添加,而是先将Object[]进行copy
复制出一个新的容器newelements,然后往新的元素中添加元素,添加完元素后在将元素的引用指向新的容器。这样做的好处是可以对容器进行
并发的读操作,而不需要进行加锁,因为当前容器不会添加任何元素。所以copyonwrite容器也是一种读写分离的思想,读和写是不同的容器


public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
         Object[] elements = getArray();
         int len = elements.length;
         Object[] newElements = Arrays.copyOf(elements, len + 1);
          newElements[len] = e;
          setArray(newElements);
         return true;
    }  finally {
         lock.unlock();
    }
}


set集合类


new hashset()的底层就是new hashmap() 创建了一个初始为16 负载因子为0.75的hashmap
与arrayList类似,可以使用
a. Collections.synchronizedSet(new HashSet<>());
b. new CopyOnWriteArraySet<>();

map集合类


1.  Collections.synchronizedMap(new HashMap<>());


2. new ConcurrentHashMap<>();

jdk1.7

ConcurrentHashMap 采用了分段锁技术,其中 Segment 继承于 ReentrantLock。
不会像 HashTable 那样不管是 put 还是 get 操作都需要做同步处理,理论上 ConcurrentHashMap 支持 CurrencyLevel (Segment 数组数量)的线程并发。每当一个线程占用锁访问一个 Segment 时,不会影响到其他的 Segment。

jdk1.8

其中抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。

 

 

 

在Java中实现线程安全的集合主要依赖于Java集合框架中的线程安全类和同步机制。常用的线程安全集合类包括: 参考资源链接:[Java生态体系精华面试题:并发、网络与Spring框架详解](https://wenku.csdn.net/doc/2mozzpp52f?spm=1055.2569.3001.10343) 1. Vector:这是最早提供的线程安全的List实现,通过synchronized关键字来实现同步访问。虽然它保证了线程安全,但由于其线程同步机制的开销较大,性能较低,现已不推荐使用。 2. Stack:继承自Vector的线程安全堆栈实现,具有先进后出(LIFO)的特性。同样由于使用同步,性能并不理想。 3. Hashtable:是早期提供线程安全的Map实现,通过synchronized方法对所有访问进行了同步。它不支持null键或值。 4. Collections.synchronizedMap:通过将普通的Map包装成一个线程安全的Map来实现。它使用了外部的synchronized语句块对方法进行同步。 5. Collections.synchronizedList、Collections.synchronizedSet:与synchronizedMap类似,这些方法可以将List和Set包装成线程安全的集合。 6. ConcurrentMap:JDK 1.5中引入的一个线程安全的Map接口,提供了一些原子操作如putIfAbsent, remove, replace等,以支持并发操作。ConcurrentHashMap是ConcurrentMap最常用的实现。 7. CopyOnWriteArrayList和CopyOnWriteArraySet:适用于读操作远多于写操作的场景,每次写操作都会复制底层数组,然后在副本上执行修改操作,之后将新数组替换旧数组。这样可以保证读操作的线程安全,但写操作成本较高。 8. BlockingQueue:JDK中的阻塞队列接口,如ArrayBlockingQueue, LinkedBlockingQueue等,它们不仅可以用于线程安全的数据处理,还可以用于线程间的通信。 9. ConcurrentLinkedQueue:一种无阻塞并发队列,适用于高并发场景下的先进先出(FIFO)数据队列。 在实际应用中,选择合适的线程安全集合类非常重要。例如,如果你需要频繁修改数据,建议使用ConcurrentHashMap而不是Hashtable,因为前者在并发写入时性能更优。如果你的应用场景中读操作远多于写操作,那么CopyOnWriteArrayList可能是一个好的选择。而对于需要等待生产者/消费者模式的场合,使用BlockingQueue系列类会更加方便。 了解这些线程安全集合类的特性和适用场景,有助于开发者在多线程编程中做出合适的选择,保证数据的一致性和系统的稳定性。推荐阅读《Java生态体系精华面试题:并发、网络与Spring框架详解》,其中详细解释了这些集合框架的使用及其在并发编程中的应用,帮助你更好地理解和掌握Java集合与并发编程的相关知识。 参考资源链接:[Java生态体系精华面试题:并发、网络与Spring框架详解](https://wenku.csdn.net/doc/2mozzpp52f?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值