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)

Java并发编程学习前期知识上篇的更多相关文章
- Java并发编程学习前期知识下篇
Java并发编程学习前期知识下篇 通过上一篇<Java并发编程学习前期知识上篇>我们知道了在Java并发中的可见性是什么?volatile的定义以及JMM的定义.我们先来看看几个大厂真实的 ...
- 学习笔记:java并发编程学习之初识Concurrent
一.初识Concurrent 第一次看见concurrent的使用是在同事写的一个抽取系统代码里,当时这部分代码没有完成,有许多的问题,另一个同事接手了这部分代码的功能开发,由于他没有多线程开发的经验 ...
- Java并发编程学习路线(转)
以前特地学过并发编程,但是没怎么学进去,不太喜欢.最近发现,作为一个资深工程师,却没有完整深入系统的学习过,而反是现在的BAT大并发是必须的,感觉甚是惭愧. 故找了一片学习文章,如下,准备集中一段时间 ...
- Java并发编程学习路线
一年前由于工作需要从微软技术栈入坑Java,并陆陆续续做了一个Java后台项目,目前在搞Scala+Java混合的后台开发,一直觉得并发编程是所有后台工程师的基本功,所以也学习了小一年Java的并发工 ...
- Java并发指南开篇:Java并发编程学习大纲
Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中 ...
- Java并发编程学习:volatile关键字解析
转载:https://www.cnblogs.com/dolphin0520/p/3920373.html 写的非常棒,好东西要分享一下 Java并发编程:volatile关键字解析 volatile ...
- Java并发编程学习笔记
Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...
- [Todo] Java并发编程学习
有两个系列的博文,交替着可以看看: 1. Java并发编程与技术内幕 http://blog.csdn.net/Evankaka/article/details/51866242 2. [Java并发 ...
- java并发编程学习:用 Semaphore (信号量)控制并发资源
并发编程这方面以前关注得比较少,恶补一下,推荐一个好的网站:并发编程网 - ifeve.com,上面全是各种大牛原创或编译的并发编程文章. 今天先来学习Semaphore(信号量),字面上看,根本不知 ...
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
随机推荐
- mysql判断两个字符串(以逗号分隔)是否存在交集
转载:https://blog.csdn.net/username666/article/details/107815331?utm_medium=distribute.pc_relevant.non ...
- ComfyUI基础篇:为什么要学 ComfyUI?
前言: 在AI生成图像领域,有许多产品,例如 Midjourney 和 Stability AI 等.为什么要学习 ComfyUI 呢?我斗胆带大家一起分析一下. 目录 1.Midjourney VS ...
- mac idea 更换主题
使用 主题一 xcode-dark-theme:点我直达 主题二 one-dark-theme:点我直达 主题三 dark-purple-theme:点我直达 主题四(推荐) vuesion-them ...
- 第二部分:关键技术领域的开源实践【内网穿透FRP】
FRP简介 FRP(Fast Reverse Proxy)作为一种高性能的内网穿透工具,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便捷的方式通过具有公网IP节点(云 ...
- 解决方案 | 预装win11如何退回win10?
0.定义 本文所说的[退回]并不指的是win10升级后的变成win11再变为win10的退回.退回应该理解为[降级],或者叫作返回上一个版本.本文的适用范围局限于,预装系统是win11,想要不通过u盘 ...
- for循环以及常用的遍历(迭代)用法
for循环以及常用的遍历(迭代)用法 概念:(概念才是高楼的地基!) for循环是一个计次循环,一般运用在循环次数已知的情况下.通常适用于枚举或遍历序列,以及迭代序列中的元素. 注意*:迭代变量用 ...
- CCF 任务调度
样例的示意图 查了一圈,然后很烦,不想学习方法,好卡.查了一些题解,发现都是10分,30分先搁置的博客,最后翻到 堪称官方标称的思路 (CCF题目pat题目各大poj/hdoj好戏那个都没有标程,这里 ...
- 深入探讨Spring Boot中的参数传递
深入探讨Spring Boot中的参数传递 在Spring Boot开发中,参数传递是一个非常常见且重要的操作.无论是处理HTTP请求,还是在方法之间传递数据,理解和掌握参数传递的各种方式都能让我们的 ...
- C# 通过反射(Reflection)调用不同名泛型方法
概述 由于工作需要,需要通过数据类型和方法名控制方法走向 用到的数据类型有8种(string,Int16,Int32,Int64,Boolean,Byte,Single,Double) 读取的方法(参 ...
- ORA-01658创建表或索引报错分析
一.报错信息 某项目最近在 SQL Loader 导数据时偶尔会报错,类似如下: SQL loader ORA-01658 unable to creale INITIAL extent for se ...