深入理解Java虚拟机(线程安全)

news2024/11/28 2:45:19

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

线程安全

当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步

  • 或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的

按照线程安全的安全程度由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类:

  • 不可变
  • 绝对线程安全
  • 相对线程安全
  • 线程兼容
  • 线程对立

不可变:

  • 不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再进行任何线程安全保障措施

【注】:

final关键字带来的可见性时曾经提到过这一点:

  • 只要一个不可变的对象被正确地构建出来(即没有发生this引用逃逸的情况)
    • 那其外部的可见状态永远都不会改变,永远都不会看到它在多个线程之中处于不一致的状态

Java语言中,如果多线程共享的数据是一个 基本数据类型,那么只要在定义时使用final关键字修饰它就可以保证它是不可变的

  • 对于对象,还没有相应的支持方式,API中符合不可变要求的类型有String之外,常用的还有枚举类型及java.lang.Number的部分子类

如Long和Double等数值包装类型、BigInteger和BigDecimal等大数据类型

  • 但同为Number子类型的原子类AtomicInteger和AtomicLong则是可变的

不可变带来的安全性是最直接、最纯粹的

绝对线程安全:

绝对的线程安全能够完全满足我们文章开头定义的线程安全概念(也就是说更加严格 )

  • (调用者都不需要任何额外的同步措施”可能需要付出非常高昂的,甚至不切实际的代价)

【注】:在Java API中标注自己是线程安全的类,大多数都不是绝对的线程安全

比如java.util.Vector是一个线程安全的容器(因为它的add()、get()和size()等方法都是被synchronized修饰的,尽管这样效率不高

  • 但保证了具备原子性、可见性和有序性,但是在多线程环境中
    • 如果不在方法调用端做额外的同步措施,使用这段代码仍然是不安全(不是绝对线程安全)的
  • 假如Vector一定要做到绝对的线程安全,那就必须在它内部维护一组一致性的快照访问才行,每次对其中元素进行改动都要产生新的快照
    • 这样要付出的时间和空间成本都是非常大的

相对线程安全 :

相对线程安全就是我们通常意义上所讲的线程安全,它需要保证对这个对象单次的操作是线程安全的

我们在调用的时候不需要进行额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性

【注】:在Java语言中,大部分声称线程安全的类都属于这种类型

  • 例如:Vector、HashTable、Collections的synchronizedCollection()方法包装的集合等

线程兼容:

线程兼容是指对象本身并不是线程安全的,但是可以通过在调用端正确地使用同步手段来保证对象在并发环境中可以安全地使用

【注】:我们平常说一个类不是线程安全的,通常就是指这种情况

  • Java类库API中大部分的类都是线程兼容的

线程对立:

线程对立是指不管调用端是否采取了同步措施,都无法在多线程环境中并发使用代码

【注】:Thread类的suspend()和resume()方法

  • 调用这两个方法的线程存在很大的死锁风险,如今已经废弃

互斥同步:

互斥同步是一种最常见也是最主要的并发正确性保障手段

互斥是实现同步的一种手段,临界区、互斥量和信号量 都是常见的互斥实实现方式

  • 互斥是因,同步是果,互斥是方法,同步是目的

【注】:最基本的互斥同步手段就是synchronized关键字、J.U.C包、重入锁ReentrantLock

  • 等待可中断:

    • 当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他事情
  • 公平锁:

    • 指多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获得锁
    • 而非公平锁则不保证这一点,在锁被释放时,任何一个等待锁的线程都有机会获得锁
  • 指一个ReentrantLock对象可以同时绑定多个Condition对象

  • 在synchronized中,锁对象的wait()跟它的notify()或者notifyAll()方法配合可以实现一个隐含的条件

  • 如果要和多于一个的条件关联的时候,就不得不额外添加一个锁

    • 而ReentrantLock则无须这样做,多次调用newCondition()方法即可

非阻塞同步:

互斥同步面临的主要问题是进行线程阻塞和唤醒所带来的性能开销,因此这种同步也被称为阻塞同步

互斥同步属于一种悲观的并发策略,而随着硬件指令集的发展,我们已经有了另外一个选择:基于冲突检测的乐观并发策略

通俗地说就是不管风险,先进行操作,如果没有其他线程争用共享数据,那操作就直接成功了

  • 如果共享的数据的确被争用,产生了冲突,那再进行其他的补偿措施,最常用的补偿措施是不断地重试,直到出现没有竞争的共享数据为止
  • 这种乐观并发策略的实现不再需要把线程阻塞挂起,因此这种同步操作被称为非阻塞同步,使用这种措施的代码也常被称为无锁编程

无同步方案:

要保证线程安全,也并非一定要进行阻塞或非阻塞同步,同步与线程安全两者没有必然的联系

同步只是保障存在共享数据争用时正确性的手段,如果能让一个方法本来就不涉及共享数据

  • 那它自然就不需要任何同步措施去保证其正确性,因此会有一些代码天生就是线程安全的

两类:

可重入代码:

又称纯代码,指可以在代码执行的任何时刻中断它,转而去执行另外一段代码(包括递归调用它本身)

而在控制权返回后,原来的程序不会出现任何错误,也不会对结果有所影响

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

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

相关文章

图片清晰修复有什么方法?归纳了三种

图片清晰修复有什么方法?图片清晰度的修复是一项常见的后期处理任务,尤其当原始照片由于各种原因如手抖、光线不足等出现模糊不清的情况时。下文将介绍三种不同的软件修复方法来帮助提高图片的清晰度和细节,让你的照片看起来更加生动和专业。…

Kubectl命令、初识pod、namespace

文章目录 一、Kubectl简介基础命令1.基本信息命令2.创建和更新资源命令3.删除资源命令4. 查看日志和调试命令5. 端口转发和复制文件命令6. 部署管理命令7. 伸缩命令8. 配置和上下文管理命令9.常用命令 二、Pod简介核心概念pod常见状态调度和初始化阶段容器创建和运行阶段异常状…

【案例52】oracle进程占用CPU100%分析实战

问题现象 Linux环境,数据库CPU一直处于100%。业务系统运行很慢。Top命令结果如下: 问题分析 方法1 根据上图中的oracle进程在操作系统对应的 PID号 : 如 6999,8100 等 通过下面的SQL,查询 select s.SQL_HASH_VALUE, s.SQL_ADDRESSfrom v$session …

PCB线宽和线间距设计PCB抄板

尽量加宽电源、地线宽度,最好是地线比电源线宽,它们的关系是:地线>电源线>信号线,通常信号线宽:0.2~0.3mm,最细宽度可达到0.05~0.07mm,电源线宽为1.2~2.5mm 一般宽度不宜小于0.2mm(8mi…

鹭鹰优化算法SBOA优化RBF神经网络的扩散速度实现多数入多输出数据预测,可以更改数据集(MATLAB代码)

一、鹭鹰优化算法介绍 鹭鹰优化算法(Secretary Bird Optimization Algorithm, SBOA)是一种新型的元启发式算法,它于2024年4月由Youfa Fu等人提出,并发表在SCI人工智能二区顶刊《Artificial Intelligence Review》上。该算法的灵感…

【机器学习】神经网络简介以及如何用Tensorflow构建一个简单的神经网络

引言 神经网络是一种模拟人脑神经元连接和工作方式的计算模型,它是深度学习的基础,并在机器学习领域中扮演着重要角色 文章目录 引言一、神经网络简介1.1 结构组成1.2 工作原理1.3 学习过程1.4 应用领域1.5 感知器1.6 功能特点1.7 总结 二、用Tensorflow…

根据 Web 服务器端的架构相关知识,将PHP改JAVA重构企业网站系统

目录 案例 【题目】 【问题 1】(7 分) 【问题 2】(8 分) 【问题 3】(10 分) 答案 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于应用服务器的叙述,在答题纸上回答问题 1 至问题 3。 【题目】 某电子产品制造公司&#xff0c…

现有electron-quick-start把vue项目打包后的dist打包exe自定义最小化点击事件

1.preload.js里暴露接口 const { contextBridge, ipcRenderer } require(electron) contextBridge.exposeInMainWorld(electronAPI, {WindowMin: (data) > {ipcRenderer.send(window-min, data);} });2.vue文件处理 if(window.electronAPI){window.electronAPI.WindowMi…

12/24/30v/36转固定5v输出芯片

设计电源芯片的应用方案时,必须保证输入电压在DC6V至30V范围内,输出电压为固定的5V,同时电流需在200至300mA之间。在这种需求下,推荐使用AH1405芯片,因其输入电压范围宽(6-40V),内置…

正则表达式——详解

正则表达式是什么? 正则表达式(Regular Expression,通常简写为 regex、regexp 或 RE)是一种强大的文本处理工具,用于描述一组字符串的模式。它可以用来匹配、查找、替换等操作,几乎所有现代编程语言都支持…

【精选】基于Python的热门旅游景点数据分析系统的设计与实现(南京旅游,北京旅游,旅游网站,全国各地旅游网站)

目录: 系统简介: 关键技术介绍 2.1 PYTHON语言简介 2.2 MySql数据库 2.3 DJANGO框架 2.4 Hadoop介绍 2.5 Scrapy介绍 2.6 B/S架构 系统总功能结构设计 系统详细实现: 6系统测试 系统测试的目的 软件测试过程 测试用例 为什么选择…

学习之nodejs安装

安装地址 https://nodejs.org/en/download/package-manager 安装 配置环境变量

【网络编程】select实现服务器与客户端进行通信

1、运行1个服务器和2个客户端 实现效果: 1、服务器和2个客户端互相聊天,服务器和客户端都需要使用select模型去实现 2、服务器要监视2个客户端是否连接,2个客户端是否发来消息,以及服务器自己的标准输入流 3、客户端…

20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡

fdisk -l df -h df -t df -T mount 20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡 2024/8/21 19:47 百度:rk3588 buildroot exFAT mount: mounting /dev/mmcblk1p1 on /mnt failed: Invalid argument Disk /dev/mmcblk1: 955 GB, 10254234…

高性能日志系统 代理模式构建全局日志器获取接口

日志器获取接口 通过两个函数,用于获取指定名称的日志器和root日志器。两个函数分别通过调用loggerManager的getInstance方法,获取单例的日志管理器对象,通过这种方式,借助日志管理器获取具体的日志器对象。 设计的主要目的&…

Nginx平滑升级与回滚示例

Nginx 的平滑升级和平滑回滚是确保 Web 服务高可用性的重要组成部分。这两种操作允许你在不中断服务的情况下更新或回滚 Nginx 的版本。 Nginx 平滑升级与回滚 Nginx 的平滑升级和平滑回滚是确保 Web 服务高可用性的重要组成部分。这两种操作允许你在不中断服务的情况下更新或…

m4a格式音频怎么转成mp3?音频转成mp3的8个方法

在结束关于M4A转MP3格式转换的探讨之际,我们不得不强调这一转换过程对于提升音频文件灵活性和可访问性的重要意义。随着数字媒体的日益普及,音频文件的格式兼容性成为了不可忽视的一环。特别是在一个多元化设备和平台共存的数字时代,确保音频…

虚拟滚动列表组件ReVirtualList

虚拟滚动列表组件ReVirtualList 组件实现基于 Vue3 Element Plus Typescript,同时引用 vueUse lodash-es tailwindCss (不影响功能,可忽略) 在 ReList 的基础上,增加虚拟列表功能,在固定高度的基础上,可以优化大数…

稳定、耐用、美观 一探究竟六角头螺钉螺栓如何选择

在机器与技术未被发现的过去,紧固件设计和品质并不稳定。但是,他们已成为当今许多行业无处不在的构成部分。六角头标准件或六角头标准件是紧固件中持续的头部设计之一,它有六个面,对广泛工业应用大有益处。六角头标准件或常分成六…

animatecss动画效果

1. 官网 https://animatecss.node.org.cn/ 2. 安装 npm install animate.css --save 使用时需要在vue中引入&#xff1a;import "animate.css;与内置组件配合使用&#xff1a; <Transition>Vue官网链接如果按照animatecss官网的用法,则只能指定进入或退出其中一…