`
enetor
  • 浏览: 184694 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java多线程专题测试四:JAVA内存模型

阅读更多

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线程:线程的交互 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实现多线程经典模型生产者消费java实现...

    JAVA多线程模型详解

    对java线程技术进行了总结,并使用图形形象地描述了线程的概念和使用,适合初学者。

    27道顶尖的Java多线程、锁、内存模型面试题!.pdf

    27道顶尖的Java多线程、锁、内存模型面试题!.pdf

    Java内存模型和线程安全

    Java内存模型和线程安全,多线程开发,高并发处理,内存模型分析

    java内存模型(有助理解多线程)

    java内存模型,对初学者比较实用,理解后有助于多线程编程等

    java内存模型和一些多线程的资料

    NULL 博文链接:https://zdsyouxiang.iteye.com/blog/939284

    Java 多线程 PPT

    Java 进程与线程 线程的概念模型 线程类 线程的同步与互斥

    java多线程的使用和介绍

    多线程详细介绍: 什么是多线程? 线程定义 使用线程的好处 一些线程模型的背景 多线程在.NET里如何工作? 多线程在JAVA里面的应用1 继承 Thread类

    java多线程详解,线程池原理,8种锁,java内存模型......

    首先希望大家喜欢我制作的文档,如果文档中有什么误解的地方,望告诉一下,5分是也不多,是系统默认的,那么就5分咯,java多线程详解,线程池原理,8种锁,java内存模型......

    Java同步线程模型分析与改进

    该文针对Java同步线程模型的缺陷,扩展synchronisedA键字语法,使它支持多个参数和能接受一个超时说明

    【多线程与高并发原理篇:3_java内存模型】.doc

    【多线程与高并发原理篇:3_java内存模型】.doc

    java多线程设计模式详解(PDF及源码)

    去睡觉吧 第11章 Thread-Specific Storage——每个线程的保管箱 第12章 Active Object——接受异步消息的主动对象 总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的...

    一篇文章弄懂Java多线程基础和Java内存模型

    文章目录一、多线程的生命周期及五种基本状态二、Java多线程的创建及启动1.继承Thread类,重写该类的run()方法2.通过实现Runnable接口创建线程类3.通过Callable和Future接口创建线程三、Java内存模型概念四、内存间...

    Java理论与实践:修复Java内存模型1

    本文介绍了Java平台把线程和多处理技术集成到了语言中,这种集成程度比以前的大多数编程语言都要强很多。关于同步和线程安全的许多底层混淆是Java内存模型的一些难以直觉到的细微差别。本文还介绍了JMM有一些严重的...

Global site tag (gtag.js) - Google Analytics