Java并发编程学习前期知识上篇
Java并发编程学习前期知识上篇
我们先来看看几个大厂真实的面试题:
从上面几个真实的面试问题来看,我们可以看到大厂的面试都会问到并发相关的问题。所以
Java并发,这个无论是面试还是在工作中,并发都是会遇到的。Java并发包JUC(java.util.concurrent)有了解过哪些?并发包实现最重要的是什么?其原理是什么知道吗?何为JMM的可见性?volatiile关键字是怎么实现变量可见性的?如果想要学好并发,弄懂理解透彻的话,凯哥觉得以下计算机的知识还是要了解了解。本次《Java并发编程-前期准备知识》凯哥准备用两篇来介绍,主要包括以下内容:简单介绍内存之间可见性是什么?volatile关键字在Java语言规范中是怎么定义的?知道JVM但是你知道JMM是什么吗?计算机中CPU是怎么处理数据的?通过CPU处理数据来深刻理解线程之间可见性。还有就是volatile是怎么保证可见性的呢?其实现的两条原理是什么?
Java并发包(JUC)下的类或者可以说Java并发机制的实现有一个关键字很重要:volatile。这个关键字,修饰的变量能够实现“可见性”。那么实现的原理是什么?
可见性是什么?
可见性:
其他叫法:变量的可见性;线程之间可见性;内存可见性。
是指当一个线程修改一个共享变量的似乎和,另外一个线程能够读到这个修改后的值。
Volatile关键字的定义
我们来看看Oracle对Java8语言规范中对Volatile的定义。访问如下:
在第8章节的8.3中国8.3.1.4对volatile字段描述:
Java编程语言允许线程访问共享变量。作为规则,为了确保共享变量被一致并可靠的更新,线程应该确保独占使用这种变量,其管用的方式是通过获取锁来实现,及强制线程互斥地使用这些变量。
Java语言还提供了第二种机制,即volatile关键字。当变量被volatile修饰后,Java内存模型会确保所有线程看到的都是该变量的一致值。
中文版翻译如下:
编辑
PS:在看书的时候书中这么描述的:Java语言规范第三版中对volatile的定义如下:xxxx.
为了找到这个说明凯哥可是各种查找,结果没找到。于是去看官方文档的时候,终于看到了。《Java语言规范 基于 Java SE 8 中文》凯哥(kaigejava)也已经准备好了。如下图:
从Java语言规范描述,我们可以知道,在Java中下次访问共享变量为了保证一致性更新有两种方式:
方式一:通过加锁事情具有排他性单独获取变量来操作
方式二:使用volatile关键字来修饰变量。
这里我们先来讲讲volatile实现变量可见性的底层原理。
在聊聊volatile底层原理前,我们先来认识另一个知识点:JMM
JMM
我们都知道JVM 即是Java虚拟机。但是JMM你知道吗?
JMM(Java Memory Model):即Java内存模型。
我们来看看Java语言规范中对JMM定义:
上图什么意思?没搞明白。简单的说:JMM是一种抽象的概念。描述的是一组规则或者是规范,通过这个规则定义了线程中的各个变量的访问方式。
JMM对线程之间同步有以下几点规定:
1:线程在释放锁的时候,必须先要把共享变量的值写回到主内存中之后,才可以释放锁
2:线程在加锁的时候,必须先把主内存中变量最新值读取到自己的工作内存中之后,才可以执行加锁操作;
3:加锁和解锁操作的必须是同一把锁。
JMM的特性:
1:可见性
2:原子性
3:有序性
在讲解JMM之前,我们再来简单了解下CPU相关的知识。
欢迎一起学习:
凯哥个人博客:www.kaigejava.com
凯哥公众号:凯哥Java(kaigejava)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从火箭发场景来学习Java多线程并发闭锁对象
从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器。最简单的是:int size = 5; 执行后,size—这种方式来实现。但是在多线程并发的情况下,这种操作会不安全的。举个现实中最典型的一个例子:火箭发射的案例。 大家都看过火箭发射的直播吧。火箭在发送的时候,有很多设备需要检查是否都准备就绪。在总控室得到所有设备都准备就绪后,才会下达发射的命令。我们也知道,火箭发射有很多设备需要检验,这不是一个部门一个一个检查的,而是多个部门协同配合实现的。如果把一个个部门看作不同的线程的话。我们就可以假设: 如果是一个部门一个一个设备检查,这就是单线程操作的; 如果是多个部门协同配合的话,就是多线程的。 所以说,在火箭发射前检查设备是 多线程情况下进行的。 我们也不知道,不同部门负责检查的设备的复杂度不同,速度不同,就会导致有些部门检查完成的快,有些部门检查完成的慢。这个过程我们可以理解为不同线程在竞争CPU资源的时候不同。 假设有5个部门同时协同工作,这5个部门的操作可以看作是一组操作。因为速度不同,那么总控室下达发射的命令是以哪个检查完毕...
- 下一篇
TiDB 4.0.0-beta.2 发布,分布式 NewSQL 数据库
TiDB 4.0.0-beta.2现已发布,该版本主要是进行了一些bug修复,具体更新内容如下: Bugfix 修复了由于编码长度为 MaxUint16 的数据而引起的恐慌15404 修复 load data 语句无法终止的问题15391 禁止创建嵌套视图15420 更新说明:https://github.com/pingcap/tidb/releases/tag/v4.0.0-beta.2
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Linux系统CentOS6、CentOS7手动修改IP地址
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境