常见的线程安全类

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

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

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

        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…

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查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

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百小僧开源框架 手术麻醉系统主要用于在手术过程中监测和控制患者的状态,确保手术的顺利进行并保障患者的生命安全。该系统通过一系列先进的医疗设备和技术,为手术患者…

AopContext.currentProxy() 的代理对象错误(未被更新)问题

背景: 原来在springAOP的用法中,只有代理的类才会被切入,我们在controller层调用service的方法的时候,是可以被切入的,但是如果我们在service层 A方法中,调用B方法,切点切的是B方法,…

【C++】STL--vector

目录 vector的使用 vector的定义 vector iterator的使用 vector空间增长问题 vector增删查改 vector深度剖析及模拟实现 vector核心接口模拟实现 使用memcpy拷贝问题 迭代器失效问题 vector的使用 vector的定义 C中,vector是一个模版,第一个参…

2024.4.5-[作业记录]-day10-CSS 布局模型(层模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.5-学习笔记1 CSS定位1.1 相对定位 relative1.2 绝对定位 absolut…

python 进度条如何控制

首先,我们需要创建一个新的python文件,点击工具栏上方的file按钮,然后在弹出的选项中选择新建,找到如图所示的新建python file,创建一个新文件。 按照提示给我们的新文件命名,然后在创建的文件中输入我们需…