线程安全集合类

使用线程不安全的集合在多线程下会发生异常
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 来保证并发安全性。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了提供高性能的线程安全集合类,java的并发包还提供了以下功能: 1. 并发执行框架:java.util.concurrent包中的Executor框架提供了一种使用线程池的方式来执行并发任务。它将任务的提交与任务的执行解耦,可以通过线程池来管理和复用线程,并提供了任务执行的调度和控制的功能。 2. 并发工具类:并发包中还提供了一些工具类,如CountDownLatch、CyclicBarrier、Semaphore等,用于帮助实现更加复杂的并发控制。这些工具类可以用于同步多个线程的执行,控制线程的并发数量,并在一些条件满足后触发线程的执行等功能。 3. 原子操作类:并发包中提供了一系列原子操作类,如AtomicInteger、AtomicLong等,用于在多线程环境下对变量进行原子操作。这些类通过使用CAS(Compare and Swap)操作来保证变量的原子性,避免了使用synchronized关键字进行同步操作带来的性能开销。 4. 并发线程安全工具类:并发包中还提供了一些线程安全的辅助类,如CopyOnWriteArrayList、ConcurrentHashMap等,用于替代传统的非线程安全集合类。这些类通过使用一些特定的并发算法来保证多线程环境下的线程安全性,能够在并发读写的情况下提供较好的性能。 总之,java的并发包不仅提供了高性能的线程安全集合类,还提供了一些并发执行框架、并发工具类、原子操作类以及线程安全工具类,用于帮助开发者在多线程环境下更加方便、高效地编写并发代码。这些功能的引入使得开发者能够更好地处理并发程序的编写与调试,提高了程序的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值