常见的线程安全类

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

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

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

        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包下的类来代替可以出现的线程安全类。

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

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

相关文章

DVWA-File Inclusion通关教程-完结

DVWA-File Inclusion通关教程-完结 文章目录 DVWA-File Inclusion通关教程-完结页面功能LowMediumHighImpossible 页面功能 点击页面上提供的三个页面,单击这些文件就会显示其执行内容,同时发现提交是由GET方式进行,使用page参数传参。 …

华为CCE部署RabbitMQ中间件操作文档

1、创建有状态(StatefulSet)部署 中间件一般为有状态部署,有状态部署与无状态部署区别参考文档:K8S有无状态部署-CSDN博客 1.1、基本信息 注意: 应用名称命名规则:(命名规则最好统一&#xff…

【linux】ubuntu ib网卡驱动如何适配

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

STL —— list

博主首页: 有趣的中国人 专栏首页: C专栏 本篇文章主要讲解 list模拟实现的相关内容 1. list简介 列表(list)是C标准模板库(STL)中的一个容器,它是一个双向链表数据结构&#xff0c…

StarRocks 面试题及参考答案详解(万字详解)

1. StarRocks 的架构设计是怎样的? 参考答案: StarRocks 的架构设计遵循了现代分布式系统的多个核心原则,以确保高性能和高可靠性。它主要由以下几个组件构成: FE(Frontend):作为前端服务,负责SQL的解析、编译和优化,以及执行计划的生成。BE(Backend):后端服务,负…

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章:2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

记录Linux系统中vim同时开多个窗口编辑文件

在使用Linux进行文本编辑的时候,通常使用vim编辑器编辑文件,当然啦,vim也可以创建文件,如果只是一个一个创建,只需要vim创建即可,但是如何一次性打开多个窗口编辑呢? 目录 1、目标:…

PHP数据类型

华子目录 数据类型PHP的八种数据类型基本数据类型,4类复合数据类型,2类特殊数据类型,2类 类型转换在PHP中有两种类型转换方式其他类型转bool类型其他类型转数值类型实例 类型判断获取和设定变量类型获取gettype(变量名)设置settype(变量名,类…

基于SSM+Jsp+Mysql的个性化影片推荐系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图

SCI,CCF,EI及核心期刊绘图宝典,爆款持续更新,助力科研! 本期分享: 【SCI绘图】【曲线图系列2 python】多类别标签对比的曲线图,文末附完整代码。 1.环境准备 python 3 import proplot as pp…

基于离散差分法的复杂微分方程组求解matlab数值仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于离散差分法的复杂微分方程组求解.“连续微分方程”到“离散微分方程”到“差分方程”,离散微分方程,变成差分方程。建立差分方程时&am…

【Java EE】SpringBoot的创建与简单使用

文章目录 🍀环境准备🌳Maven🌲SpringBoot是什么🎄Spring Boot 项目创建🌸使用Idea创建🌸创建SpringBoot项⽬🌸SpringBoot项目的运行 ⭕总结 🍀环境准备 如果你的IDEA是专业版&#…

C++数据结构与算法——回溯算法分割问题

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

算法基本概念

算法基本概念 算法的定义 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法的特性 输入:算法具有0个或多个输入输出:算法至少有一个或多个输出有穷性确定性可行性 算…

设计模式(14):命令模式

介绍 将一个请求封装为一个对象,从而使我们可用不同的请求对象客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称之为:动作Action模式,事务transaction模式。 命令模式角色 抽象命令类(Comman…

VS CODE环境安装和hello world

SAP UI5 demo walkthrough tutorial step1 hello word 首先要安装nodejs,然后才能执行下面的操作 nodejs vscode 安装ui5npm install --global @ui5/cli报错解决: idealTree:npm: sill idealTree buildDeps 这个信息说明npm正在构建,如一直停留在这个界面,检查下网络,例如…

Redis常用命令补充和持久化

一、redis 多数据库常用命令 1.1 多数据库间切换 1.2 多数据库间移动数据 1.3 清除数据库内数据 1.4 设置密码 1.4.1 使用config set requirepass yourpassword命令设置密码 1.4.2 使用config get requirepass命令查看密码 二、redis高可用 2.1 redis 持久化 2.1.1 持…

【51单片机入门记录】A/D D/A转换器概述

目录 一、A/D D/A转换器简介 (1)模数转换器-ADC (analogue-to-digital conversion) (2)数模转换器-DAC(digital-to-analogue conversion) (3)应用场景 二…

用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列

适用于AGV物流机器人的爱普生陀螺仪传感器XV7000系列:XV7001BB,XV7011BB。以前我们都知道XV7001BB,XV7011BB适用于扫地机器人,其实对于AGV物流机器人来说,XV7000系列生陀螺仪传感器也是其中重要一环。AGV机器人又叫做AGV搬运机器人…

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design+百小僧开源框架

C#手术麻醉信息系统源码,技术框架:Vue,Ant-Design百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态,确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术,为手术患者…