常见的线程安全类

线程安全!线程安全!!线程安全!!!

鼠鼠我最近被线程安全这个词弄得好烦啊,那既然如此就来写一篇常见的线程安全类防止以后鼠鼠我的大脑又宕机了忘记了.......

这里我们讨论的线程安全的是指,多个线程调用它们同一个实例的某个方法时,是线程安全的。他们的每个方法是原子的,但是他们多个方法的组合并不是原子的。举个例子如下:

        Hashtable hs = new Hashtable();
        if (Objects.isNull(hs.get("key"))){
            hs.put("key","value");
        }

Hashtable的每个方法都是现成安全的,但是组合在一起的时候仍然会有线程上下文切换的风险导致的非线程安全。

String类,Integer

这里把这两个类放在一起说,因为他们都是不可变类,因为其内部的状态是没法改变的,因此它们的方法都是线程安全的,话不多说直接上源码。

这里用String举例,首先String是一个有final修饰的字符数组,为了防止子类去破坏父类中方法的行为,final修饰的是不允许被修改的,然后鼠鼠这里用subString() 方法进行举例,可以看到最后一行是new了一个新的String对象,我们跟进后发现在构造方法中存在一个范围复制。因此每次对字符串类进行更改的时候底层都是new了一个新的对象,从而不会出现线程安全问题。

Integer类在这里不过多赘述,读者可以跟着源码进行阅读。

StringBuffer

可以看到StringBuffer首先也是被final关键字修饰的类,StringBuffer的方法中使用了synchronized 关键字进行同步处理,当一个线程想要去访问StringBuffer对象的方法时,其他线程必须等待这个线程执行完后才能继续访问,这样就保证了在多线程环境下,对 StringBuffer 的操作不会发生冲突,从而确保了线程安全性。

Random

Random 类在 Java 中是线程安全的。这是因为 Random 类的实现使用了一个 AtomicLong 类型的变量来维护其种子状态,并且在生成随机数时使用了 CAS(Compare-And-Swap)操作,这使得在多线程环境下,不同线程之间的状态变更能够被正确同步,从而确保了线程安全性。

在 Random 类的实现中,每个线程都会有一个独立的种子状态,因此即使多个线程同时使用 Random 对象生成随机数,它们之间也不会产生竞争或者冲突,从而保证了线程安全性。

总的来说,Random 类的线程安全性是由其实现机制所保证的,而不需要开发者在使用时额外考虑线程安全的问题。

Vector类,Hashtable

在Vector类和Hashtable类中的方法大多是由synchronized关键字修饰的,但是这个类和下述的Hashtable类已经被弃用。

java.util.concurrent包下的类

我们平日说的JUC就是这几个字母的缩写,这里简述为什么java.util.concurrent包下的类是线程安全的。

  1. 使用了同步机制:这些类通常使用了各种同步机制,如锁、信号量、原子变量等,来确保多个线程可以安全地访问共享资源。

  2. 提供了高级并发工具:java.util.concurrent包提供了许多高级的并发工具,如线程池、并发集合、并发队列等,这些工具在设计时考虑了线程安全性。

  3. 避免了常见的并发问题:这些类避免了一些常见的并发问题,如死锁、竞态条件等,通过设计和实现来确保线程安全。

  4. 经过严格测试和优化:Java并发包下的类经过了严格的测试和优化,以确保其在多线程环境下的正确性和性能。

java.util.concurrent包下的类的效率已经不断地在优化,在日常使用中推荐使用java.util.concurrent包下的类来代替可以出现的线程安全类。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C#】版本号

💻 代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp16 {internal class Program{static void Main(string[] args){Version version01 new Version("4.0.0…

软件设计师-基础知识科目-计算机基础知识1

前言: 我去年11月份参加了软件设计师的考试,一次性顺利通过了该考试。去年11月份的考试首次改革成机考。考试时间上从一整天压缩成一个下午。考试难度无法评价,因为是第一次参加该考试。我考前利用4个月时间准备,准备时间看似很长…

Word wrap在计算机代表的含义(自动换行)

“Word wrap”是一个计算机术语,用于描述文本处理器在内容超过容器边界时自动将超出部分转移到下一行的功能。在多种编程语言和文本编辑工具中,都有实现这一功能的函数或选项。 在编程中,例如某些编程语言中的wordwrap函数,能够按…

检查网站连接是否安全

要确认某个网站是否可以安全地进行访问,您可以查看有关该网站的安全信息。如果您无法安全地或以私密方式访问网站,浏览器将会发出提醒。 1. 在 浏览器 中,打开相应网页。 2.要确认网站的安全性,请查看网址左侧显示的安全状态图标…

学习:面向云备份提供商的 Solidigm 固态硬盘

SSD与HDD的区别 SSD和HDD之间的主要区别在于它们如何存储和传输数据。HDD有一个旋转盘片或磁盘,用于读取和写入数据。HDD的每GB初始价格通常低于SSD,这使其成为大型机构(如金融机构、政府数据存储设施、高性能计算中心(HPC&#…

ERC314协议代币开发及合约开发详解

ERC314 是一种新的代币标准,旨在为 BASE 链上的代币提供更便捷、高效的交易体验。它由 DAPJ 项目团队开发,并于 2023 年 8 月首次发布。 ERC314 的特点 无需依赖 DEX 或 SWAP 进行交易: ERC314 代币可以像原生代币一样直接转账,无需借助 DEX …

[mmu/cache]-MMU的地址翻译(Address translation)指令介绍

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈 Address translation system instructions AT指令的语法格式: 有了上面的语法格式后,就非常好理解armv8的MMU提供了14条AT指令了: MMU的地址…

【编译原理】手工打造语法分析器

重点: 语法分析的原理递归下降算法(Recursive Descent Parsing)上下文无关文法(Context-free Grammar,CFG) 关键点: 左递归问题深度遍历求值 - 后续遍历 上一篇「词法分析器」将字符串拆分为…

elementPlus el-table动态列扩展及二维表格

1、循环列数据源&#xff0c;动态生成列 <template><div><el-table ref"table" :data"pageData.tableData" stripe style"width: 100%"><el-table-column v-for"column in pageData.columns" :key"column.p…

linux虚拟机上安装,使用以及远程连接mysql

1. 安装mysql 5.7 1) 首先更新软件源 sudo apt-get update 2) 安装MySQL数据库软件 ​ sudo apt-get install mysql-server 3) 安装MySQL数据库管理软件​ sudo apt-get install mysql-client 4) 安装MySQL数据库客户端&#xff0c;用户访问数据库 sudo apt-get install…

大数据系列 | Kafka架构分析及应用

大数据系列 | Kafka架构分析及应用 1. Kafka原理分析2. Kafka架构分析3. Kafka的应用3.1. 安装Zookeeper集群3.2. 安装Kafka集群3.3. 生产者和消费者使用3.3.1. 生产者使用3.3.1. 消费者使用 4. Kafka Controller控制器 1. Kafka原理分析 Kafka是一个高吞吐量、 持久性的分布式…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章: L…

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

vue3+element-ui-plus的el-tree组件实现复选框形式下的单选功能,且禁用父级

实现效果图&#xff0c;一二级都是灰色的不可选&#xff0c;三级只能同时选中一个 <el-treev-model"selectedNode":data"deptOptions":props"{ label: title, children: children }" //自定义名称和子集的字段:render-after-expand"fal…

天府锋巢直播产业基地:打造电商直播产业先锋集群

天府锋巢直播产业基地&#xff0c;这座以科技金融服务、人才项目扶持、科技企业培育和产业生态链赋能为核心的成都直播产业园区&#xff0c;正积极招商引资&#xff0c;争做电商直播产业的先锋集群。 一、科技金融服务方面&#xff0c;天府锋巢直播产业基地针对科技型小微企业、…

部署k8s客户端,及docker私仓部署

1.部署一个docker私仓 mkdir /opt/docker/registry #配置仓库密码 mkdir /opt/docker/auth cd /opt/docker/auth htpasswd -Bbn admin admin > htpasswd#运行docker私仓服务&#xff0c;下面端口5000:5000 前面的5000对应本机端口可以自定义 docker run -itd \ -v /opt/d…

ios苹果ipa文件app内测分发有哪些操作流程

哈喽&#xff0c;大家好&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;在iOS应用开发过程中&#xff0c;进行内测分发是非常重要的一环&#xff0c;它能帮助开发者发现并修复应用中的问题&#xff0c;提升用户体验。上两期咱们一起探讨了一下App内测分发的目的及优势&#…

Spring之ApplicationListener实现监听原理

文章目录 ApplicationListener使用方式ApplicationListener实现原理1.引入并实例化时机2.作用时机3.发布事件&#xff0c;生效 总结 ApplicationListener使用方式 package com.cyl.listener;import org.springframework.context.ApplicationEvent; import org.springframework…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

文件夹类型变无?别担心,数据恢复有高招!

在日常使用电脑的过程中&#xff0c;不少用户都遇到过这样一个令人头疼的问题&#xff1a;原本整齐有序的文件夹突然变成了“类型变无”的状态。这种情况让人措手不及&#xff0c;不仅影响了文件的正常访问&#xff0c;更可能导致重要数据的丢失。那么&#xff0c;文件夹类型变…