文档章节

java多线程详解一线程的内存模型和线程特性

o
 onedotdot
发布于 2018/07/14 16:36
字数 1247
阅读 34
收藏 10

这几天面试互联网公司的高级java工程师,多线程问的相对而言比较多。所以,从各种角度来看看java中多线程的实现方式。

一.Java多线程中的内存模型

1.java主内存和工作内存

根据java内存模型,java中所有的变量都存储在主内存中(main memory),每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了主内存的副本拷贝,线程对所有变量的操作都必须在工作内存中进行而不能操作主内存的变量。不同的线程不能访问别的线程工作内存中的变量,线程之间的变量值传递必须要通过主内存来完成,线程、主内存、工作内存三者的交互关系如下图所示:

2.内存之间的交互操作

java内存模型定义了8种不同操作来完成,虚拟机实现时候必须保证这8种操作都是原子的、不可再分的。

lock(锁定):主要作用于主内存变量,它把一个变量标志为一条线程独占的状态。

unlock(解锁):作用于主内存变量,它将处于一个锁定状态的变量释放出来,释放出来的内存变量才能被其他线程锁定。

read(读取):作用于主内存的变量,它把一个变量的值从主内存中运输到线程的工作内存中,以便随后的load指令使用。

laod(载入):作用于工作内存的变量,它把主内存中读到的变量放入工作内存变量的副本中。

use(使用):作用于工作内存中的变量,它把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量值的字节码指令时候回执行这个操作。

assign(赋值):作用于工作内存变量,它把一个从执行引擎接受到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的字节码的时候执行这个操作。

store(存储):作用于工作内存中的变量,它把工作内存中的一个变量送到主内存中,以便以后的write操作使用。

write(写入):作用于主内存中,它把store操作从工作内存中得到的变量的值放入主内存中。

 

2.多线程中的原子性、可见性、有序性

1.原子性

原子性:由java内存模型来直接保证原子性的操作包括read、load、assign、use、store和write。基本数据类型访问具有原子性(除了long 和double类型特殊的非原子协定)。

如果需要更大范围的原子性操作的时候,java内训模型还提供了lock()和unlock()操作来完成这种需求。在字节码层次上提供了monitorebter和moniterexit来隐式的使用这个操作,这两个字节码反映到java代码中就是同步代码块--sychronized关键字。

2.可见性

可见性:是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。

java内存模型是通过变量在修改后的新值同步回主内存中,在变量读取前从主内存刷新变量值住,这种依赖 主内存作为传递媒介的方式来实现可见性的。通过volatile保证了线程之间的可见性。同样还有synchronized 和final 来实现线程可见性。

同步代码块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store 和 write操作)”。被final修饰的普通变量在构造器中一旦初始化完成,并且构造器没有把"this"关键字的引用传递出去,那么在其他线程中就能看见final关键字的值。

3.有序性

有序性:在java语言中提供了volatile和synchronized俩个关键字来保证线程之间操作是有序性,volatile关键字本身包含了禁止指令重排序的语义,而sychronized则是由“一个变量在同一时刻只允许一个线程进行lock操作”,这条规则决定了持有同一个锁的同步代码块只能串行地进入。

4、happen-before原则

本文转载自:https://blog.csdn.net/qzqanzc/article/details/55668012

o
粉丝 11
博文 382
码字总数 16064
作品 0
朝阳
私信 提问
【并发编程】一文带你读懂深入理解Java内存模型(面试版本)

     并发编程这一块内容,是高级资深工程师必备知识点,25K起如果不懂并发编程,那基本到顶。但是并发编程内容庞杂,如何系统学习?本专题将会系统讲解并发编程的所有知识点,包括但不限...

java进阶架构师
2018/12/26
0
0
基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程

许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存、CPU、缓存等予以说明。实际上,在实...

leoliu168
2018/11/08
0
0
基于JVM原理JMM模型和CPU缓存模型深入理解Java并发编程

许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存、CPU、缓存等予以说明。实际上,在实...

Java高级技术
2018/11/21
0
0
轻量级的同步机制——volatile语义详解(可见性保证+禁止指令重排)

1.关于volatile volatile是java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能。它主要有两重语义,一是保证多个线程...

takumiCX
2018/07/12
0
0
JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体...

王磊的博客
01/14
165
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (19. 数据库)

19.1.1. 存储引擎 19.1.1.1. 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、 更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧...

Shingfi
8分钟前
1
0
三分钟手操自己的yum源

本文章原创首发公众号:编程三分钟 上次就想手操yum源了,考虑到有的朋友没接触过,直接写成了yum源的科普,活活憋了我一个星期,现在我们快快开始。 什么情况下我们需要搭建一个仓库呢? 记...

编程三分钟
12分钟前
3
0
一起来学Java8(二)——Lambda表达式

Lambda简介 什么是Lambda表达式,简单的说是一种匿名函数表达方式。因此Lambda表达式本质是个函数,只不过没有函数名称。 Lambda表达式具有以下特点: 匿名,它没有函数名称 本质是个函数,除...

猿敲月下码
14分钟前
3
0
排序算法之希尔排序

1、介绍。 希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D...

daxiongdi
22分钟前
3
0
log4j2入门hello world

1.什么是log4j2 (1)log4j log4j是apache的一个开源项目,表示log for java.是一个日志工具,可以将日志信息输出到文件,控制台等其他地方 ,还可以定义日志的输出格式,另外还有日志级别的区分,可...

Blueeeeeee
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部