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的 ...
随机推荐
- 计算订单签收率的sql查询思路与过程(涉及百分比和四舍五入)
领导提出一个签收率需求,想要通过数据库达到excel中表现的形式,提高计算速度和工作效率, 如下形式: 数据库中表数据结构: 部分数据如下: sql语句思路如下: -- 1.已签收:以物流反馈管道,状 ...
- JVM学习笔记-如何在IDEA打印JVM的GC日志信息
若要在Idea上打印JVM相应GC日志,其实只需在Run/Debug Configurations上进行设置即可. 拿<深入Java虚拟机>书中的3-7代码例子来演示,如 1 public ...
- $Kruskal$ 算法的实现 | 最小生成树
\(Kruskal\) 算法 以 Luogu P3366 为例题 实现方法:从小到大遍历每一条线,如果该线连接的两点已经都在树内则不处理,否则描出这条线 从小到大是一个贪心的实现方法,由于每描出一条线 ...
- css-渐变简约的登录设计
代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- Javascript克隆数据
JS 复制数据 1 浅复制 具体方法 // 数组 Array.prototype.slice // 普通对象 Object.assign 思考 2 深复制 1) function deepClone( ...
- MySQL索引是怎么支撑千万级表的快速查找?
前言 在 MySQL 官方提到,改善操作性能的最佳方法 SELECT 在查询中测试的一个或多个列上创建索引.索引条目的作用类似于指向表行的指针,从而使查询可以快速确定哪些行与WHERE子句中的条件匹配 ...
- oeasy教您玩转vim - 70 - # 折叠细节
折叠细节 回忆上次 上次我们讲的是折叠 折叠有很多options foldlevel - 显示折叠层次 foldcolumn - 折叠树宽度 foldmethod - 折叠方式 manual - ...
- 机器学习:详解迁移学习(Transfer learning)
详解迁移学习 深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中.所以例如,也许已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那 ...
- 使用 useRequestEvent Hook 访问请求事件
title: 使用 useRequestEvent Hook 访问请求事件 date: 2024/7/23 updated: 2024/7/23 author: cmdragon excerpt: 摘 ...
- 预处理共轭梯度算法(Preconditioned Conjugate Gradients Method)的代码实现
前文: 预处理共轭梯度算法(Preconditioned Conjugate Gradients Method) 给出代码: import numpy as np # from rllab.misc. ...