并发(4)

目录

16.sychronized修饰方法在抛出异常时,会释放锁吗?

17.多个线程等待同一个sychronized锁的时候,JVM如何选择下一个获取锁的线程?

18.sychronized是公平锁吗?

19.volatile关键字的作用是什么?

20.volatile能保证原子性吗?

21.volatile是如何实现可见性的?

22.volatile是如何实现有序性的?

23.说下volatile的应用场景?

24.所有的final修饰的字段都是编译期常量吗?

25.如何理解private所修饰的方法是隐式地final?


16.sychronized修饰方法在抛出异常时,会释放锁吗?

17.多个线程等待同一个sychronized锁的时候,JVM如何选择下一个获取锁的线程?

非公平锁,即抢占式。

18.sychronized是公平锁吗?

synchronized实际上是非公平的,新来的线程有可能立即获得监视器,而在等待区中等候已久的线程可能再次等待,这样有利于提高性能,但是也可能导致饥饿现象。

19.volatile关键字的作用是什么?

防重排序

我们从一个最经典的例子来分析重排序问题。大家应该都很熟悉单例模式的实现,而在并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的方式来实现。

其源码如下:

现在我们分析以下为什么要在变量singleton之间加上volatile关键字。要理解这个问题,先要了解对象的构造过程,实例化一个对象其实可以分三个步骤:

1.分配内存空间。

2.初始化对象。

3.将内存空间的地址赋值给对应的引用。

但是由于操作系统可以对指令进行重排序,所以上面的过程也可能会变成如下过程:

1.分配内存空间。

2.将内存空间的地址赋值给对应的引用。

3,初始化对象

如果是这个流程,多线程环境下就可能将一个未初始化的对象引用暴露出来,从而导致不可预料的结果。因此,为了防止这个过程的重排序,我们需要将变量设置为volatile类型的变量。

实现可见性

可见性问题主要指一个线程修改了共享变量值,而另一个线程却看不到。引起可见性问题的主要原因是每个线程拥有自己的一个高速缓冲区-线程工作内存。

volatile关键字能有效的解决这个问题,我们看下下面的例子,就可以直到其作用:

直观上说,这段代码的结果只可能有两种:b=3;a=3或者b=2;a=1。不过运行上面的代码(可能时间上要长一些),你会发现除了上面两种结果之外,还出现了另外两种结果:

为什么会出现b=2;a=3和b=3;a=1这种结果呢?正常情况下,如果先执行change方法,再执行print方法,输出结果应该为b=3;a=3。相反,如果先执行的print方法,再执行change方法,结果应该是b=2;a=1。那b=3;a=1的结果是怎么出来的呢?原因就是第一个线程将值a=3修改后,但是对第二个线程是不可见的,所以才出现这一结果。如果将a和b都改成volatile类型的变量再执行,则再也不会出现b=2;a=3;a=1的结果了。

保证原子性:单次读/写

volatile不能保证完全的原子性,只能保证单次读/写操作具有原子性。

20.volatile能保证原子性吗?

不能完全保证,只能保证单次的读/写操作具有原子性。

21.volatile是如何实现可见性的?

内存屏障。

22.volatile是如何实现有序性的?

happens-before等

23.说下volatile的应用场景?

使用volatile必须具备的条件:

1.对变量的写操作不依赖于当前值

2.该变量没有包含在具体其他变量的不变式中。

3.只有在状态真正独立于程序内其他内容时才能使用volatile。

例子1:单例模式

单例模式的一种实现方式,但很多人会忽略volatile关键字,因为没有该关键字,程序也可以很好的运行,只不过代码的稳定性综合不是100%,说不定在未来的某个时刻,隐藏的Bug就出来了。

例子2:volatile bean

在volatile bean模式中,JavaBean的所有数据成员都是volatile类型的,并且getter和setter方法必须非常普通-除了获取或者设置相应的属性外,不能包含任何逻辑。此外,对于对象引用的数据成员,引用的对象必须是有效不可变的。(这将禁止具有数组的属性,因为当数组引用被声明为volatile时,只有引用而不是数组本身具有volatile语义)。对于任何volatile变量,不变式或约束都不能包含JavaBean属性。

24.所有的final修饰的字段都是编译期常量吗?

不是

25.如何理解private所修饰的方法是隐式地final?

类中所有private方法都隐式地指定为final的,由于无法取用private方法,所以也就不能覆盖他。可以对private方法增添final关键字,但这样做并没有什么好处。

看下下面的例子:

Base和Son都有方法test(),但是这并不是一种覆盖,因为private所修饰的方法是隐式地final,也及时无法被继承,所以更不用说是覆盖了,在Son中test()方法不过是属于Son的新成员罢了,Son进行向上转型得到father,但是father.test()是不可执行的,因为Base中的test()方法是private的,无法被访问到。

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

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

相关文章

基于日照时数计算逐日太阳辐射

基于日照时数计算逐日太阳辐射

分布式【Zookeeper】

1.1 ZooKeeper 是什么 ZooKeeper 是 Apache 的顶级项目。ZooKeeper 为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。在解决分布式数据一致性方面,ZooKeeper 并没有直接采用 Paxos 算法&…

安全加固之weblogic屏蔽T3协议

一、前言 开放weblogic控制台的7001端口,默认会开启T3协议服务,T3协议则会触发的Weblogic Server WLS Core Components中存在反序列化漏洞,攻击者可以发送构造的恶意T3协议数据,获取目标服务器权限。 本文介绍通过控制T3协议的访问…

vue3 的内置组件汇总

官方给出的说明: Fragment: Vue 3 组件不再要求有一个唯一的根节点,清除了很多无用的占位 div。Teleport: 允许组件渲染在别的元素内,主要开发弹窗组件的时候特别有用。Suspense: 异步组件,更方便开发有异步请求的组件。 一、fr…

商品砍价系统设计原理与实践:技术解析与注意事项

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

SpringBoot 调用mybatis报错:Invalid bound statement (not found):

启动SpringBoot报错:Invalid bound statement (not found): 参考此文排查 命中了第6条 记录一手坑爹的Invalid bound statement (not found)(六个方面) mapper文件路径配置错误 订正以后 问题解决

GLSL着色器入门(持续更新中...)

目录 第一章:OpenGL works with triangles 第二章: Parallel Processing 第章 推荐来自b站的课程004 GLSL is not Javascript_哔哩哔哩_bilibili 第一章:OpenGL works with triangles 当我们谈论GLSL着色器时,其实就是在说怎么…

开发个小破软件——网址导航,解压就能用

网址导航 网站导航也称链接目录,将网站地址或系统地址分类,以列表、图文等形式呈现,帮助快速找到需要的地址。 应用场景 高效查找:网址导航是很好的入口,通过分类清晰的网站推荐,可以迅速访问网站资源。…

数据的创建、调用、修改、删除存储过程,以及第一类丢失更新(回滚丢失)和 第二类丢失更新(覆盖丢失/两次更新问题)

数据的创建存储过程、调用存储过程、修改存储过程、删除存储过程,以及第一类丢失更新(回滚丢失)和 第二类丢失更新(覆盖丢失/两次更新问题) 文章目录 一、创建存储的语法二、调用存储过程三、修改存储过程四、删除存储…

【python实战】python一行代码,实现文件共享服务器

一行代码实现文件共享 在一个局域网内,需要共享一个文件夹里内容。 我们可以在任意一台有python环境的电脑上,迅速架起一个http协议的服务,然后将文件夹里的文件内容共享出来。是的仅仅需要一行代码 就是这么简单 把电脑的相关项目文件通…

Python中的有序字典是什么

有序字典 一、简介 Python中的字典的特性:无序性。 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的。 二、普通字典 #! /usr/bin/env python3 # -*- coding:utf-8 -*- d1 {} d1[a] A d1[b…

【Unity】 HTFramework框架(四十七)编辑器日志中使用超链接的技巧

更新日期:2024年1月3日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 日志中使用超链接超链接-网络地址超链接-本地地址超链接-项目资源文件超链接-脚本对象 日志中使用超链接 在编辑器控制台Console中的日志是支持富文本的&…

使用Spring Cache优化数据库访问

使用Spring Cache优化数据库访问 在这篇博客中,我们将学习如何使用Spring Cache来优化数据库访问,提高系统性能。我们将创建一个简单的图书管理应用作为示例,并演示如何通过缓存减少对数据库的频繁查询。 1. 项目结构 首先,我们…

web自动化(6)——项目配置和Grid分布式

1. 框架的可配置性 项目之间的区别: 兼容性:有些项目只兼容chrome,有些只兼容Firefox等元素定位特点:有些项目闪现快,有的项目很慢有些项目集成Jenkins,不需要用python生成allure报告 如果想要我们的框架…

cesium键盘控制模型

效果: 由于对添加模型和更新位置api进行二次了封装,下面提供思路 1.添加模型 const person reactive({modelTimer: null,position: {lon: 104.07274,lat: 30.57899,alt: 1200,heading: 0,pitch: 0,roll: 0,}, }); window.swpcesium.addEntity.addMo…

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面: 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节:tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术:数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…

【教学类-43-16】 20240106 推算5-9宫格数独可能出现的不重复题量(N宫格数独模板数量的推算)

作品展示: 通过对各种已有结果的人工推算,目前得到两个结论 一、阶乘基本样式的数量【【123】【321】【231】【132】【312】【312】】6组 结论:阶乘等于出现的基本样式数量 以下N*N格会出现的最大排序数量(比如包含333222111这种…

玩转爱斯维尔 LaTeX 模板:定制技巧一网打尽!

简介 关于 LaTeX 小编写过一些推文: 适合撰写课程论文的 LaTeX 模板; LaTeX 常用数学符号汇总; 免费升级 overleaf 高级账户!; 如何下载使用期刊的 LaTeX 模板 本文基于常用的 Elsevier 期刊模板,小编分享个人常用的使用技巧&#xff0…

nvidia-smi 完整查看显卡型号

当我们在使用nvidia-smi查看显卡的型号的时候,会发现出现如下问题: 可以看到我们此时无法看到显卡的准确型号,只能看到NVIDIA GeForce ... 解决方法:使用如下命令即可完整显示显卡型号 nvidia-smi -L 如下所示:

APP自动化测试工具:八款推荐解析

如果想学习提升找不到资料,没人答疑解惑时,请及时加入群:1150305204,里面有各种测试开发资料和技术可以一起交流哦。 uiautomator2 github地址:github.com/openatx/uia… UiAutomator 是 Google 提供的用来做安卓自动…