JAVA内存模型
1、什么是内存模型,什么是可见性?
jvm系统中存在一个主内存(Main Memory或Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。
每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
当对象在从工作内存同步到主内存之前,那么它就是不可见的。若有其他线程在存取不可见对象就会引发可见性问题。
2、happens-before原则试图解决什么问题?
共享对象可见性和安全发布的问题
为了能让开发人员安全正确地在Java存储模型上编程,JVM提供了一个happens-before原则,有人整理得非常好,我摘抄如下:
-
在程序顺序中, 线程中的每一个操作, 发生在当前操作后面将要出现的每一个操作之前.
- 对象监视器的解锁发生在等待获取对象锁的线程之前.
- 对volitile关键字修饰的变量写入操作, 发生在对该变量的读取之前.
- 对一个线程的 Thread.start() 调用 发生在启动的线程中的所有操作之前.
-
线程中的所有操作 发生在从这个线程的 Thread.join()成功返回的所有其他线程之前.
有了原则还不够,Java提供了以下工具和方法来保证变量的可见性和安全发布:
-
使用
synchronized来同步变量初始化。此方式会立马把工作内存中的变量同步到主内存中
-
使用
volatile关键字来标示变量。此方式会直接把变量存在主存中而不是工作内存中
-
final变量。常量内也是存于主存中
分享到:
相关推荐
Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程...
详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠...
Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的调度-合并 22 Java线程:线程的调度-终止线程 25 Java线程:...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
对java线程技术进行了总结,并使用图形形象地描述了线程的概念和使用,适合初学者。
27道顶尖的Java多线程、锁、内存模型面试题!.pdf
Java内存模型和线程安全,多线程开发,高并发处理,内存模型分析
java内存模型,对初学者比较实用,理解后有助于多线程编程等
NULL 博文链接:https://zdsyouxiang.iteye.com/blog/939284
Java 进程与线程 线程的概念模型 线程类 线程的同步与互斥
多线程详细介绍: 什么是多线程? 线程定义 使用线程的好处 一些线程模型的背景 多线程在.NET里如何工作? 多线程在JAVA里面的应用1 继承 Thread类
首先希望大家喜欢我制作的文档,如果文档中有什么误解的地方,望告诉一下,5分是也不多,是系统默认的,那么就5分咯,java多线程详解,线程池原理,8种锁,java内存模型......
该文针对Java同步线程模型的缺陷,扩展synchronisedA键字语法,使它支持多个参数和能接受一个超时说明
【多线程与高并发原理篇:3_java内存模型】.doc
去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...
文章目录一、多线程的生命周期及五种基本状态二、Java多线程的创建及启动1.继承Thread类,重写该类的run()方法2.通过实现Runnable接口创建线程类3.通过Callable和Future接口创建线程三、Java内存模型概念四、内存间...
本文介绍了Java平台把线程和多处理技术集成到了语言中,这种集成程度比以前的大多数编程语言都要强很多。关于同步和线程安全的许多底层混淆是Java内存模型的一些难以直觉到的细微差别。本文还介绍了JMM有一些严重的...