并发(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.hqwc.cn/news/326991.html

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

相关文章

缘分的计算

题目描述: 缘分是一个外国人难以理解的中文名词。大致说来,缘分是一种冥冥中将两人(通常是情人)结合的力量。仅管这是种迷信,很多人——特别是女生——喜欢去计算它。 不幸的是,644 也是这样。有天&#x…

WEB 3D技术 three.js 顶点缩放

本文 我们来说 顶点缩放 我们官网搜索 BufferGeometry 下面有一个 scale 函数 例如 我们先将代码写成这样 上面图片和资源文件 大家需要自己去加一下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/j…

第10课 实现多对多音视频会议功能

在前两节课,我们将推流端与播放端合并为一对一音视频聊天功能并解决了关键的回声问题,在此基础上,我们可以进一步改进实现多对多的视频会议功能。 1.备份demo9并修改demo9为demo10。 2.打开工程文件,修改mfc为四分屏画面。 界面…

CUDA并行编程

引入 并行能帮我们提高代码性能,而GPU在硬件上是能够更好地实现一些并行工作的,能够更大程度地并行。 CUDA是SIMT模型,只用写一个程序,其中就包含了CPU部分和GPU并行部分的代码,那么就需要指明哪些是CPU(…

C语言程序设计——数学运算

基本运算符 运算符说明例子赋值运算符a b;、-、*、/、()基本四则运算a (a c) * d;%取余运算符a b % 2&、^、~、l位运算a ~b l c>>、<<左移和右移a b >> 2 在c语言的数学运算中&#xff0c;所涉及到的符号如图所示&#xff0c;在使用过程中应该了…

软件测试面试总结分享

第一轮 自我介绍。根据自己的情况扩展。你是怎么理解软件测试的&#xff1f;我觉得软件测试是很重要的岗位&#xff0c;如果一个系统开发完后不通过测试去产品质量把关&#xff0c;产品不能正常运行可能造成的后果&#xff0c;损失钱财、损失时间、损失客户等等&#xff0c;所…

Leetcode刷题笔记题解(C++):无重复字符的最长子串

思路&#xff1a; 利用滑动窗口的思想&#xff0c;用起始位置startindex和curlength来记录这个滑动窗口的大小&#xff0c;并且得出最长距离&#xff1b;利用哈希表来判断在滑动窗口中是否存在重复字符&#xff0c;代码如下所示&#xff1a; class Solution { public:int len…

MySQL之视图内连接、外连接、子查询案例

目录 一.视图 1.1 含义 1.2 操作 二.案例 三.思维导图 一.视图 1.1 含义 虚拟表&#xff0c;查询方面和普通表一样使用。 1.2 操作 1.创建视图&#xff1a; create or replace view 视图名 as 查询语句&#xff1b; 2.视图的修改&#xff1a; 方式1 create or replace view …

keras,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - keras。 Github地址&#xff1a;https://github.com/keras-team/keras 深度学习已经成为解决各种复杂问题的有力工具&#xff0c;而 Python Keras 是…

小游戏实战丨基于PyGame的俄罗斯方块小游戏

文章目录 写在前面PyGame五子棋注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame的俄罗斯方块小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700182 实验环境 python3.11及以上pycharmtkinter PyGame Pygame是一个非常…

在 sealos 上使用 redisinsight 完美管理 redis

先起一个 redis 集群&#xff0c;在 sealos 上可以点点鼠标就搞定&#xff1a; 简单两步&#xff0c;redis 集群搞定。 再启动 RedisInsight, 是一个 redis 的可视化管理工具。 就可以看到部署后的地址了。进去之后填写 redis 的链接信息即可&#xff1a; 链接信息在数据库的…

如何建立标准且有效的评审流程?6个重点

为了进一步提高项目质量&#xff0c;项目评审管理需要遵循一定的标准化流程。而建立标准且有效的评审流程&#xff0c;能够快速提高项目质量和效率&#xff0c;优化团队协作&#xff0c;降低风险&#xff0c;提高项目成功率。如果组织没有建立起标准化的评审流程&#xff0c;就…