面试中经常问到的线程安全的集合类,这样回答会显得很优雅

news2024/11/17 18:28:26

前言:
本篇文章主要讲解面试中经常问到的线程安全的集合类的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始

文章目录

  • 线程安全的类,集合,关键字总结
    • 线程安全类
    • 线程安全集合
    • 线程安全方法
  • StringBuffer
  • Hashtable

在这里插入图片描述

线程安全的类,集合,关键字总结

Java中的部分类,集合,关键字都能保证线程安全,接下来我们从线程安全的类,集合,关键字详细介绍:

线程安全类

线程安全类:线程安全类是一些经过设计,能够在多线程环境下安全地使用的类,它们大多数都是通过内部实现同步机制保证正常工作。线程安全类主要有以下几种:

  • StringBuffer:线程安全的字符串缓冲区,所有对于它的操作都是同步的。
  • Vector:线程安全的数组序列,支持对其中的元素进行增删查改等操作。
  • Hashtable:线程安全的哈希表,也就是键值对映射(Map),所有对于它的操作都是同步的。
  • ConcurrentHashMap:线程安全的哈希表,采用了分段锁的方式,不同线程可以同时对不同的分段进行操作。

线程安全集合

线程安全集合:线程安全集合是能够在线程安全的前提下支持快速地添加、查询、删除其中元素的集合。Java中线程安全的集合主要有以下几种:

  • CopyOnWriteArrayList:线程安全的动态数组,它对于写操作会复制当前数组,修改完后再将它赋值给原引用,因此读操作和写操作可以同时进行而不需要加锁。
  • CopyOnWriteArraySet:线程安全的集合,它采用了CopyOnWriteArrayList来实现,保证了元素唯一、有序,并且在读操作的同时也可以进行写操作
  • ConcurrentLinkedQueue:线程安全的队列,它采用了CAS(Compare And Swap)算法来保证并发操作时的原子性。

线程安全方法

线程安全方法:Java中也提供了许多线程安全方法,这些方法在多线程环境下能够保证数据的正确性,主要有以下几种:

  • synchronized关键字:能够锁住当前代码块或方法,保证同一时间只能有一个线程进入执行该代码块或方法。
  • volatile关键字:保证变量的可见性以及禁止指令重排序,从而保证多线程情况下变量的正确性。
  • Atomic类:提供了一组原子操作方法,使用CAS算法保证操作的原子性。
  • Lock接口及其实现类:提供了更加灵活的锁机制,支持不可重入锁、可重入锁以及读写锁等。
  • ThreadLocal类:为每个线程提供了独立的变量副本,从而避免了线程安全问题。

StringBuffer

StringBuffer是Java中用于字符串操作的可变类,它在多线程环境下通过使用synchronized关键字来保证线程安全。
在这里插入图片描述

  • 方法级别的同步:StringBuffer的方法(如append(), delete(), replace()等)都使用synchronized关键字进行同步。这意味着每个方法在执行时会获取一个对当前StringBuffer实例的锁,防止其他线程同时访问和修改对象。

  • 可变性:StringBuffer是可变类,允许在原始字符串上进行修改操作。而不像String类那样是不可变的。这可以避免在多线程环境中创建大量的临时字符串对象,减少内存开销。

  • 线程安全的追加操作:StringBuffer的append()方法是线程安全的,因为它在内部使用了同步机制。多个线程可以并发调用append()方法,确保结果正确。

尽管StringBuffer提供了线程安全的操作,但在现代的Java应用程序中,通常更倾向于使用StringBuilder类。与StringBuffer相比,StringBuilder没有同步机制,因此更高效。如果不需要在多线程环境中共享可变字符串对象,建议使用StringBuilder。如果确实需要在多线程环境中进行字符串操作,可以使用StringBuffer来保证线程安全。

Hashtable

Hashtable是Java中的一种哈希表实现,它基于数组和链表结构实现。下面介绍Hashtable的底层原理:

内部存储结构
Hashtable内部使用一个数组来保存元素,每个数组元素称为桶(bucket)。通过将键值哈希后得到索引值,在对应的桶中存储相应的值。如果多个键值映射到同一个索引上,就会在这个索引的桶上形成一个链表。

哈希函数
Hashtable使用哈希函数将键转换成整数索引,从而快速定位桶。Java默认提供了一种简单的哈希函数:hashCode()方法,可以生成32位整数类型的哈希码。

解决哈希冲突
由于不同键可能映射到相同的索引位置上,所以必须要解决哈希冲突问题。通常有两种解决办法:拉链法(Chaining)和线性探测(Linear Probing)。

拉链法:当发生哈希冲突时,在当前位置建立一个链表来存储所有键值映射到该位置上的数据。
线性探测:当发生哈希冲突时,在当前位置往后寻找下一个空槽并插入数据。
Hashtable采用了拉链法来解决哈希冲突。当多个键值映射到同一个桶上时,Hashtable会在这个桶上建立一个链表,将不同的键值对存储在链表中。

扩容
为了避免哈希冲突导致性能下降,Hashtable采用了动态扩容机制。当元素数量超过负载因子(load factor)时,默认0.75,Hashtable会自动进行扩容操作,并重新分配桶数组大小和哈希码。

线程安全
Hashtable是线程安全的,在多线程环境下可以并发访问,但是效率相对较低。因为它采用了synchronized关键字来保证线程安全。
在这里插入图片描述

Hashtable小结:

  • 方法级别的同步:Hashtable的方法(如put(), get(), remove()等)都使用synchronized关键字进行同步。这意味着每个方法在执行时会获取一个对当前Hashtable实例的锁,阻止其他线程同时访问和修改对象。

  • 互斥访问:由于synchronized关键字的存在,一次只能有一个线程访问Hashtable的方法。这种互斥访问确保了线程之间的安全性,并防止并发修改导致数据不一致的问题。

  • 内部同步机制:Hashtable使用内部锁来保护其状态。当一个线程正在执行一个方法时,其他线程会被阻塞,直到该线程完成操作。

  • 原子操作:Hashtable的方法在执行时是原子的,即一个方法的执行是不可分割的。这确保了操作的完整性,防止多个线程同时对同一个键值对进行操作。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

03【锁、事务原理、MVCC】

文章目录 一、MySQL锁机制1.1 锁的分类1.1.1 按操作分1.1.2 按粒度分1.1.3 按算法划分 1.2 MyIsam引擎锁1.2.1 准备数据1.2.2 MySIAM引擎写锁1.2.3 MySIAM引擎读锁1.2.4 小结1.2.5 表锁应用场景1.2.6 InnoDB的表锁1.2.7 MyISAM 的并发插入1.2.8 MyISAM的锁调度 1.3 InnoDB 引擎…

通达信超跌反弹选股公式,使用筹码函数WINNER

在前面的文章中,已经介绍了WINNER函数,不过对于如何使用函数,当时只进行了简单举例,没有做深入研究。本文将结合WINNER函数的特性,编写通达信超跌反弹选股公式。 WINNER函数表示获利盘比例,取值范围是0-1&…

【Leetcode】17.电话号码的字母组合

一、题目 1、题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例1: 输入:digits = "23" 输出:["ad","ae",…

剑指 Offer 38: 字符串的排列

这道题一看就是使用回溯法,但是由于是排列,所以索引和组合不同(组合的索引是从start标志位开始),排列是从下标为0开始,并且需要借助排序!所以需要先转化成将String转化为char[]类型,…

微信小程序开发流程

如今微信小程序定制需要一个开发周期和流程,比起模板来说,定制开发的流程更加复杂。做微信小程序定制开发,首先要做的工作就是确定需求和框架的确立,比如一个社交小程序,可能考虑的问题不只是用户之间消息沟通&#xf…

Android 之 Handler

Android 的消息机制是基于Handler实现的。Handler 采用的是一种生产者-消费者模型,Handler 就是生产者,通过它可以生产需要执行的任务。而 Looper 则是消费者,不断从 MessageQueue 中取出Message 对这些消息进行消费。 MesageQueue是在底层调…

maven-mvnd(新版maven)

引言: Maven和Gradle几乎包含了所有Java项目的构建。 而目前绝大部分的Java项目都是使用Maven的方式,Maven对比Gradle的劣势很明显,就是太慢了! 一、maven-mvnd是什么? maven-mvnd是Apache Maven团队开发的maven的…

python学习笔记-1

文章目录 cmd中写py基本语法字面量字符串 注释变量数据类型数据类型转换标识符 cmd中写py 如果我没有素质,就说我是日本人 基本语法 字面量 字面量:在代码中,被写下来的,固定的值,称之为字面量。有六种值&#xff0…

下载iOS开发教程:下载和安装指南

目录 引言 一. 下载安装appuploader windows启动 部分功能不可用处理 驱动安装 二. 登录appuploader 常规使用登录方法 验证码说明 使用上传专用密码登录 未支付688给apple账号登录 [ 五、代码实现](# 五、代码实现) 六、总结 引言 这里汇总了开发相关过程中的热门…

【vue element-ui 】el-table中使用checkbox视图更新滞后

本来想通过列表中每个对象的某个属性绑定到checkbox的状态,但是发现有个问题:就是点击复选框后,数据确实改变了,但是视图没有改变,当点击其他row的时候,才会更新之前的数图。如下图,第1次勾选第…

【JavaScript】严格模式use strict

use strict 它不是一条语句,但是是一个字面量表达式声明,在 JavaScript 旧版本中会被忽略。 为什么使用严格模式use strict: 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为; 消除代码运行的一些不安全之处,保证代…

Jmeter调试取样器(Debug Sampler)

大家在调试 JMeter 脚本时有没有如下几种需求: 我想知道参数化的变量取值是否正确!我想知道正则表达式提取器(或json提取器)提取的值是否正确!我想知道 JMeter 属性!调试时服务器返回些什么内容&#xff0…

复杂数组的处理方法之多维数组扁平化

1.需求: 将数组[1,2,[3,4,[5,6]],7,[8,[9,10]]] 转换为 [1,2,3,4,5,6,7,8&#xff0c…

五、HAL_Timer的定时功能

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、定时器简介 (1)定时器可以通过输入的时钟源进行计数,从而达到定时的功能。 3、实验目的&原理图 3.1、实验目的 (1)通过定时器设置定时,实现LED灯以500…

13 - 信号可靠性剖析

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录 1. 信号的可靠性1.1 问题1.2 信号查看(kill -l)1.3 信号的分类1.3.1 不可靠信号(传统信号)…

模拟仿真 OSC振荡器

用五个反相器做一个环形振荡器 跑瞬态仿真 发现并未振荡 手动添加起振 成功振荡 将上面的图像send to calculate,调用频率函数freq 可以看到振荡频率为2.5GHZ左右 如果想要降低振荡频率,可以在每个反相器后加寄生电容或者增大反相器尺寸,这…

ProGuard详解 - Java代码混淆

(29条消息) ProGuard详解 - Java代码混淆_黎陌MLing的博客-CSDN博客

【算法题】动态规划基础阶段之 爬楼梯 和 杨辉三角

动态规划基础阶段之爬楼梯和杨辉三角 前言二、爬楼梯2.1、思路2.2、代码实现 三、杨辉三角3.1、思路3.2、代码实现 四、杨辉三角2(进阶)总结 前言 动态规划(Dynamic Programming,简称 DP)是一种解决多阶段决策过程最优…

脱机下载程序

一,脱机下载工具 Mini-Pro V2 版 二,配置stm32CubeIDE 生成hex文件 三,脱机下载步骤 1,连接设备,选择芯片 2, 添加固件。 3,选项字节。 4,生成镜像文件,这个文件包含了…