首页 > 其他分享 >【知识点】高并发中的集合

【知识点】高并发中的集合

时间:2024-03-25 22:12:22浏览次数:20  
标签:知识点 return synchronized index 并发 Vector 线程 集合

本文旨在总结多线程情况下集合的使用


Java中的集合大致以下三个时期:

第一代线程安全集合类

VectorHashTable为代表的初代集合,使用synchronized在修饰方法,从而保证线程安全。

缺点:效率低

代码示例

Vectoradd方法源码

/**
 * Appends the specified element to the end of this Vector.
 *
 * @param e element to be appended to this Vector
 * @return {@code true} (as specified by {@link Collection#add})
 * @since 1.2
 */
public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}

Vectorget方法源码

/**
 * Returns the element at the specified position in this Vector.
 *
 * @param index index of the element to return
 * @return object at the specified index
 * @throws ArrayIndexOutOfBoundsException if the index is out of range
 *            ({@code index < 0 || index >= size()})
 * @since 1.2
 */
public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);
}

可以看到方法都是synchronized修饰的,无条件对集合类进行了同步处理。

第二代非线程安全集合类

第二类就是以ArrayListHashMap为代表的集合,非线程安全,但是性能好,用来代替VectorHashTable
因为大部分情况下集合都是在单线程中使用。

在需要线程安全时,通过Collections.synchronizedList(list)Collections.synchronizedMap(map)进行同步处理,这两个方法会返回一个线程安全的内部集合类(定义在Collections)。

底层使用的也是synchronized同步一个内部锁对象,相对直接锁方法有微弱性能提升。

第三代线程安全集合类

java.util.concurrent包下面添加了大量多线程类。集合相关的类以ConcurrentHashMapCopyOnWriteArrayList(Set)类为代表。

其中,ConcurrentHashMap使用了分段锁读写分离等方式提高了并发性。

分段锁机制(Segmentation):ConcurrentHashMap 内部使用了分段锁的机制。它将整个哈希表分成了多个段(Segment),每个段相当于一个小的哈希表,每个段都独立地加锁。这样不同的线程在访问不同的段时可以并发进行,从而提高了并发访问的效率。当需要修改哈希表时,只有涉及到相应段的锁才会被加锁,而不是锁住整个表。

读写分离:ConcurrentHashMap 允许多个线程同时进行读操作,读操作不会阻塞,这样就提高了读操作的并发性。只有在写操作的时候才会进行加锁,以确保写操作的线程安全性。

CopyOnWriteArrayList一般用于读多写少的场景下:

它的原理是在对容器进行修改(如添加、删除元素)时,并不直接在原有数据结构上进行操作,而是先将原有的数据复制一份,在新的副本上进行修改,完成后再将修改后的副本赋值回原数据结构。因此称之为“写时复制”。

标签:知识点,return,synchronized,index,并发,Vector,线程,集合
From: https://www.cnblogs.com/code-blog/p/18095528

相关文章

  • set集合 and 字典 笔记
    set()集合S={1,"你好",2,3}print(type(s))print(s)不可哈希:python中的set集合进行数据存储的时候。需要对数据进行哈希计算,根据计算出的哈希值进行数据存储set集合要求存储必须是可以进行哈希计算的可哈希:不可变的数据类型,int,str,tuple,bool不可哈希:可变的数据类型,kli......
  • Java并发编程:第六章 阻塞队列
    文章目录一、BlockQueue1、特点2、阻塞队列常用方法二、常见的BlockingQueue1、介绍2、ArrayBlockingQueue3、LinkedBlockingQueue4、PriorityBlockingQueue5、LinkedTransferQueue6、SynchrousQueue7、DelayQueue一、BlockQueue1、特点阻塞队列与普通队列(ArrayDe......
  • Java并发编程学习
    1.4wait()与notify例如消息队列生成和消费消息时候,可以用 wait(), notify通知对方wait和notify必须在synchronized方法里。1) wait释放当前线程的锁,线程进入等待状态,直到其他线程调用该对象的notify2)notify其他随机一个线程对应的等待状态解除。可以竞争当......
  • 知识点
    在JavaScript中,const是用来声明一个常量的关键字。使用const声明的变量是常量,其值在声明后不能被修改。换句话说,一旦使用const声明一个变量并初始化赋值,就无法再对其重新赋值。下面是一个简单的示例:javascriptCopyCodeconstPI=3.14159;//尝试修改常量的值会导致错......
  • Java并发面试题(一)
    1.并行和并发有什么区别?并行(Parallelism)和并发(Concurrency)在计算机科学中都是关于处理多个任务或操作的重要概念,但它们之间存在显著的差异。以下是并行和并发的主要区别:并发(Concurrency):任务交错执行:并发指的是两个或多个任务在同一时间段内开始,但它们的执行是交错进行的......
  • 浅谈Java中的集合
    下面内容自己结合B站视频写的总结为什么要用集合一般情况下保存多个数据使用的数组,但是数组灵活性不够,有很多不足,如:长度开始时必须指定,而且指定之后不能修改保存的必须为同一类型的元素使用数组进行增删比较麻烦集合1、集合可以根据需要动态增加或减少其大小2、Jav......
  • 【JS】并发请求
    需求封装一个函数,做到可以进行并发请求,并将结果返回。该函数接收两个参数,分别为urls和maxNum。urls是数组,其中元素均为请求地址;maxNum表示最大并发数。如果有完成的请求,会从urls中,按序取出下一个请求,请求的结果会计入返回的数组中,返回的数组中元素的索引与参数urls中保......
  • 构建树形结构集合的方法-Java
    完整代码如下构建树形结构方法importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;publicclassTableUtils<T>{/***集合构建成层级结构**ps:处于顶级的数据,上下级字段值必须为......
  • redis实际应用场景及并发问题的解决
    业务场景接下来要模拟的业务场景:每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。1.每个回合只有15秒。2.每次普通攻击的时间间隔是0.5s3.这个服务是一个集群(这个要求暂时不实现)编写接口,实现上述需求。核心问题可以想到要解决的主要问题是,1.如何......
  • JUC并发编程(六)
    1、无锁实现保护共享资源       此前提到过,多个线程同时操作共享资源会导致安全问题,常见的方式是通过加锁(synchronized,reentranlock)解决。但是很显然加锁在某些场景下会影响性能,是否有一种方式可以不用加锁,且保证线程安全?下面来看一个案例1.1、案例一@Slf4j(topic......