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)