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)

Java并发编程学习前期知识上篇的更多相关文章

  1. Java并发编程学习前期知识下篇

    Java并发编程学习前期知识下篇 通过上一篇<Java并发编程学习前期知识上篇>我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义.我们先来看看几个大厂真实的 ...

  2. 学习笔记:java并发编程学习之初识Concurrent

    一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...

  3. Java并发编程学习路线(转)

    以前特地学过并发编程,但是没怎么学进去,不太喜欢.最近发现,作为一个资深工程师,却没有完整深入系统的学习过,而反是现在的BAT大并发是必须的,感觉甚是惭愧. 故找了一片学习文章,如下,准备集中一段时间 ...

  4. Java并发编程学习路线

    一年前由于工作需要从微软技术栈入坑Java,并陆陆续续做了一个Java后台项目,目前在搞Scala+Java混合的后台开发,一直觉得并发编程是所有后台工程师的基本功,所以也学习了小一年Java的并发工 ...

  5. Java并发指南开篇:Java并发编程学习大纲

    Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中 ...

  6. Java并发编程学习:volatile关键字解析

    转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...

  7. Java并发编程学习笔记

    Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...

  8. [Todo] Java并发编程学习

    有两个系列的博文,交替着可以看看: 1. Java并发编程与技术内幕 http://blog.csdn.net/Evankaka/article/details/51866242 2. [Java并发 ...

  9. java并发编程学习:用 Semaphore (信号量)控制并发资源

    并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知 ...

  10. Java并发编程学习笔记 深入理解volatile关键字的作用

    引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...

随机推荐

  1. 【Python】用Python把从mysql统计的结果数据转成表格形式的图片并推送到钉钉群

    ** python把数据转为图片 / python推送图片到钉钉群 ** 需求:通过python访问mysql数据库,统计业务相关数据.把统计的结果数据生成表格形式的图片并发送到钉钉群里. 一:Cen ...

  2. 基础篇:Stable Diffusion 基础原理详述

    [基础篇]Stable Diffusion 基础原理详述 前言 我认为学习 ComfyUI 应该先从理论学起. 与传统绘图工具(如 Photoshop 或 Figma)相比,AI 绘图工具有着显著不同 ...

  3. python使用flask框架生成excle返回前端(包含图片、表格、表头灰色、表格加边框)

    python使用flask框架生成excle文档,文档中包含图片和表格,其中表格要包含图片.表格.表头灰色.表格加边框,照片和表格不重叠. 逻辑:获得图片的高度,根据高度计算表格从第几行开始插入. 效 ...

  4. KubeCube 用户管理与身份认证

    前言 KubeCube (https://kubecube.io) 是由网易数帆近期开源的一个轻量化的企业级容器平台,为企业提供 kubernetes 资源可视化管理以及统一的多集群多租户管理功能.K ...

  5. django 设置外键的时候,related_name的值大写还是小写,规则怎样

    django 设置外键的时候,related_name的值大写还是小写,规则怎样 在Django中,related_name参数用于定义反向关系的名称,即通过外键字段反向查询关联模型的对象.relat ...

  6. [oeasy]python0022_框架标题的制作_banner_结尾字符串_end

    ​ 结尾字符串(end) 回忆上次内容 ​python3​​ 的程序是一个 5.3M 的可执行文件 ​​python3​​ 里面存的是 cpu 指令 可以执行的那种 我们可以把指令对应的汇编找到 ​​ ...

  7. Java JVM——13. 垃圾回收相关算法

    1.生存还是死亡? 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象,GC 才会在执行垃圾回 ...

  8. ambari+ bigtop 编译、打包、部署步骤总览

    1 ambari + bigtop 构建大数据基础平台 1.1 参考: 1.2 参考 amabri bigtop 打包部署 2 ambari+bigtop编译.打包.部署 2.0 基础环境准备 2.1 ...

  9. 【DingTalk】钉钉应用开发

    前言部分 最近要开发一个企业内部应用系统 无纸化办公使用钉钉,领导想在钉钉的基础上加入我们自己的应用 引入Activiti工作流引擎开发审批立项等等业务活动,做一个大一统的系统 然后让我负责开发钉钉应 ...

  10. 【Shiro】05 自定义Realm认证实现

    [前提情要] Shiro默认使用自带的IniRealm,IniRealm从ini配置文件中读取用户的信息, 大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. 根接口:Realm ...