首页 > 其他分享 >【面试】高并发中的集合

【面试】高并发中的集合

时间:2024-03-23 13:22:05浏览次数:20  
标签:index return synchronized 面试 并发 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一般用于读多写少的场景下:

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

标签:index,return,synchronized,面试,并发,Vector,线程,集合
From: https://www.cnblogs.com/code-blog/p/18091011

相关文章

  • 数据库面试高频题目 - 深度解析 MySQL:探秘关系型数据库的核心技术(一)
       本文将深入探讨MySQL,这是关系型数据库中的核心技术,被广泛应用于数据存储和管理。透过高频面试题解析,我们将深入研究MySQL在数据建模、查询优化和事务处理中的作用。无论你是初学者还是渴望加深对关系型数据库技术的了解,本文都将为你提供实用的面试准备。一、innod......
  • SpringBoot 面向面试学习(2023.03.23更新)
    导语在网上找了很多SpringBoot相关的教程,要么是针对初学者面向实战入门的视频,要么基于面试但存在收费或不全面的问题……因此参考网上博客特此总结了一些可能常见的面试题,循序渐进,以问题为导向,以面试为场景进行学习/复习。JavaGuide提供的Spring常见面试题总结可以去看,里面......
  • Java学习笔记:ArrayList集合
    目录为什么要有集合:解决数组自动扩容的问题Java、python数据类型对比Java支持的数据类型主要分为两大类:Python支持多种数据类型,主要包括以下几种:在Java中常见的数据类型实现方式:Java通过使用集合框架来解决一组数据的存储和管理Java集合大致也可分成List、Set、Queue、Map四种接口......
  • Java面向对象编程面试题
    序号问题详细答案1什么是类与对象?类和对象实例之间的关系?   类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象,对象是类的实例化;类是静态的,对象是动态的,对象可以看作是运行中的类。类负责产生对象,可以将类当成生产对象的工厂2构造函数的特点有哪些(1......
  • Java回溯知识点(含面试大厂题和源码)
    回溯算法是一种通过遍历所有可能的候选解来寻找所有解的算法,如果候选解被确认不是一个解(或至少不是最后一个解),回溯算法会通过在上一步进行一些变化来丢弃这个解,即“回溯”并尝试另一个候选解。回溯法通常用递归方法来实现,在解决排列、组合、选择问题时非常有效。回溯算法的......
  • P1466 [USACO2.2] 集合 Subset Sums
    题目传送门:P1466[USACO2.2]集合SubsetSums-洛谷|计算机科学教育新生态(luogu.com.cn)https://www.luogu.com.cn/problem/P1466//https://www.luogu.com.cn/problem/P1466//背包#include<bits/stdc++.h>usingnamespacestd;intval[40],f[40][1005];//f[i][......
  • java基础50道面试题
    java基础50道面试题一、java基础1.equals与==区别在Java中,"=="是一个比较操作符,用于比较两个变量的值是否相等。而"equals()"是Object类中定义的方法,用于比较两个对象是否相等。具体区别如下:1."=="用于比较基本数据类型和引用类型变量的地址值是否相等。对于基本数据类型,比......
  • 计算机/网安 面试例题(四)
    一、Web常问1.SQL注入原理的种类?防御呢?预编译原理?原理:在数据交互中,前端的数据传入到后台处理时,由于后端没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。种类:字符,数字,布尔,报错,延迟,联合,堆叠,宽字节,XFF等修复:使用预编译,PDO,正则表......
  • 关于并发编程一些问题与解决--事务回滚@Transactional
    先贴一下代码吧@Transactional@OverridepublicintupSunp(Integera_id){//查询数据库QueryWrapper<Animal>animalQueryWrapper=newQueryWrapper<>();animalQueryWrapper.eq("a_id",a_id);Animalanima......
  • 洛谷题单指南-集合-P1525 [NOIP2010 提高组] 关押罪犯
    原题链接:https://www.luogu.com.cn/problem/P1525题意解读:有很多罪犯,要关到两座监狱,有一些罪犯之间有仇,并且可以量化出仇恨值,如果关在一起就会冲突,造成的影响就是仇恨值,要使得造成的影响最小,如果可以完全不起冲突,输出0。解题思路:首先,要让冲突影响最小化,显然应该把仇恨大的罪犯......