文档章节

深入理解Java内存模型——笔记(一)

多弗哥
 多弗哥
发布于 2017/01/24 18:26
字数 588
阅读 15
收藏 0

    1. 并发编程模型的分类

    在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以沟通机制来交换信息,同步是指程序用于控制不同线程之间操作发生相对顺序的机制。在命令式编程中,Inter-process communication大体有两种方法:共享内存和消息传递,前者应用较多,比如主流的操作系统,后者在网络编程、即时消息领域应用的较多(主要是为了消除锁 locking 的概念,从而减少在这方面的系统消耗),比如web game、Erlang语言。概况来说:

  • 共享内存模型:显式同步,隐式通信;
  • 消息传递模型:显式通信,隐式同步

    由于Java并发采用共享内存模型,所以Java线程之间的通信总是隐式进行的。

 

    2. Java内存模型的抽象

    Java线程之间的通信由JMM控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系。

    在《The Java™ Language Specification Java SE 7 Edition》提到:

  • 实例域、静态域和数组元素存储在堆内存中,堆内存在线程之间共享;
  • Java虚拟机有一个堆内存,它在所有Java虚拟机线程之间共享。堆是存放运行时数据的内存区域,所有类的实例和数组都在堆上分配;
  • Java虚拟机有一个在所有线程之间共享的方法区。它存储每一个类的结构信息,比如运行时常量池、域和方法数据,以及方法和构造函数的字节码;
  • 方法区在虚拟机启动的时候创建。尽管方法区是堆的逻辑部分,但简单的JVM实现可以选择不对其进行垃圾收集或压缩。

    ※ 这里把这个包含了方法区的堆称之为“广义上的堆”。“堆内存在线程之间共享的共享”指的是“广义上的堆”而非“Java堆”。

 

    3. 

 

 

 

© 著作权归作者所有

上一篇: Linux 常用目录
下一篇: Java 内存模型
多弗哥
粉丝 15
博文 40
码字总数 148187
作品 0
杭州
高级程序员
私信 提问
读《深入理解Java虚拟机》- 笔记08

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第10章 早期(编译期)优化 59. 语法糖 在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。 泛型是一种语法糖...

阿历Ali
2018/08/18
0
0
《成神之路-基础篇》JVM——JVM内存结构(已完结)

Java内存模型,Java内存管理,Java堆和栈,垃圾回收 本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 参考文章: Java虚拟机的内存组成以及堆内存介绍 Java堆和栈...

2018/05/05
0
0
《成神之路-高级篇》Java并发编程——锁

本文是《成神之路系列文章》的第一篇,主要是关于JVM的一些介绍。 持续更新中 数据库相关锁机制 数据库的锁机制 表级锁、行级锁、页级锁 共享锁、排他锁 乐观锁与悲观锁 乐观锁、悲观锁 乐观...

HollisChuang's Blog
2018/10/14
0
0
Java并发(1)- 聊聊Java内存模型

引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距。为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来...

knock_小新
2018/07/18
0
0
JVM 深入笔记(3)垃圾标记算法

JVM深入笔记(3)垃圾标记算法 Author: Poechant Blog: blog.CSDN.net/Poechant Email: zhongchao.ustc#gmail.com (#->@) Date: March 3rd, 2012 Copyright © 柳大·Poechant 如果您还不了解......

晨曦之光
2012/04/24
99
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针操作文件 柔性数组使用

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct _info* pInfo;struct _info{int line;int len;char data[0];}info;int getFil......

小张525
40分钟前
0
0
中介者模式

https://blog.csdn.net/jason0539/article/details/45216585

南桥北木
40分钟前
0
0
抽离css以及公共js

分离css 分离css:为何要把 CSS 文件分离出来,而不是直接一起打包在 JS 中。最主要的原因是我们希望更好地利用缓存。 extract-text-webpack-plugin > 1. 假设我们原本页面的静态资源都打包成...

莫西摩西
今天
2
0
Jenkins的配置从节点中默认没有Launch agent via Java Web Start,该如何配置使用

Jenkins的配置从节点中默认没有Launch agent via Java Web Start,如下图所示,而这种启动方式在Windows上是最方便的。 如何设置才能让出来呢? 1:打开"系统管理"——"Configure Global Sec...

shzwork
今天
2
0
BAT面试必问HashMap源码分析

HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈...

别打我会飞
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部