第12章 Java内存模型与线程

Java内存模型 

  主内存与工作内存:

    java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存。

    工作内存中保存了该线程使用的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行。

  内存间交互操作:

    1 lock 作用于主内存的变量,它把一个变量标识为一个线程独占的状态。

    2 unlock 作用于主内存的变量,把锁定的变量释放出来

    3 read 作用于工作内存的变量,把一个变量的值从主内存传输到线程的工作内存中。

    4 load 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中

    5 use 作用于工作内存的变量 把工作内存中一个变量的值传递给执行引擎

    6 assign 作用于工作内存的变量, 把一个从执行引擎收到的值赋给工作内存的变量

    7 store 作用天工作内存的变量,把工作内存中一个变量的值传送到主内存中。

    8 write 作用于主内存的变量,把store操作从工作内存中得到的变量的值放入主内存中

  当一个变量定义为volatile后,它将具备两种特性

    1 保证此变量对所有线程的可见性,对于非原子性的操作,仍然不是线程安全的。

    2 禁止指令重排序优化。

  原子性、可见性与有序性

  先行先发原则

Java线程的状态转换

  新建 New 创建后沿未启动的纯种处于这种状态

  运行 Runnable 包括了操作系统线程状态中的Running和Ready,处于此状态的线程有可能正在执行,也有可能正在等等着CPU为它分配执行时间

  无限期等待 Waiting 处于这种状态的线程不会被分配CPU执行时间,它们要等待被其它线程显式地唤醒:没有设置Timeout参数的Object.wait()方法;没有设置Timeout参数的Thread.join()方法;LockSupport.park()方法

  限期等待 Timed Waiting 处于这种状态的线程也不会被分配CPU执行时间,不过无须等待被期它线程显式地唤醒,在一定时间后它们会由系统自动唤醒: Thread.sleep()方法;设置了Timeout参数的Object.wait()方法;设置了Thimeout参数的Thread.join()方法;LockSupport.parkNanos()方法;LockSuport.parkUnitl()方法

  阻塞 Blocked 等待着获取到一个排他锁

  结束 Terminated 已终止线程的线程状态

深入理解java虚拟机-第12章Java内存模型与线程的更多相关文章

  1. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  2. 《深入理解JAVA虚拟机》----------第二章 JAVA内存区域与内存溢出异常,笔记(下)

    2. HotSpot虚拟机对象探秘 2.1 对象的创建 虚拟机遇到一条New指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初 ...

  3. [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常

    2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...

  4. Java虚拟机之JVM系统和内存模型

    1.类加载子系统 负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间里. 2.方法区 存放类信息.常量信息.常量池信息.包括字符串字面量和数字常量等,方法区的大小决 ...

  5. 《深入理解Java虚拟机》-----第12章 Java内存模型与线程

    概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了.在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速 ...

  6. Java 运行时数据区和内存模型

    运行时数据区是指对 JVM 运行过程中涉及到的内存根据功能.目的进行的划分,而内存模型可以理解为对内存进行存取操作的过程定义.总是有人望文生义的将前者描述为 "Java 内存模型" ...

  7. 深入理解java虚拟机_第二章_读书笔记

    1.本章内容目录: 概述 运行时数据区域 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 对象的内存布局 对象的访问定位 ...

  8. 第12章 Java内存模型与线程

    参考<深入理解Java虚拟机> 一.Java内存模型 1.Java内存模型 2.内存间交互操作  流程图: 3.volatile关键字 两个特性: 3.1.保证变脸对所有线程的可见性: 由 ...

  9. 《深入理解Java虚拟机》学习笔记之内存分配

    JVM在执行Java程序的过程中会把它所管理的内存划分若干个不同的数据区域,如下图: 大致可以分为两类:线程私有区域和线程共享区域. 线程私有区域 程序计数器(Program Counter Regi ...

随机推荐

  1. LVS管理工具--ipvsadm

    一. ipvsadm工具介绍 从2.4版本开始,linux内核默认支持LVS.要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm. LVS的结构主要分为两部分: 工作在内核空间的IPVS ...

  2. Django学习笔记之Django视图View

    一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. ...

  3. 菜单Menu

    <Menu HorizontalAlignment="> <MenuItem Header="文件"> <MenuItem Header=& ...

  4. 对MySQL数据类型的认识

    简述 良好的逻辑设计和物理设计是高性能系统的基石,比如反范式设计可以加快某些类型的查询同时也会影响另外一些类型的查询效率,所以我们必须重视Mysql对于数据库的设计(本文主要讲述表字段类型对于数据库性 ...

  5. JAVA基础补漏--ArrayList

    今天在写代码的时候,index定义的时候用了Integer,在list.remove(index)的时候,总是不成功,后来发现如果用Integer定义的时候,index不再是基础数据类型,被识别为re ...

  6. PHP练习题二

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L  a: }5 ...

  7. spring security使用哈希加密的密码

    之前我们都是使用MD5 Md5PasswordEncoder 或者SHA ShaPasswordEncoder 的哈希算法进行密码加密,在spring security中依然使用只要指定使用自定义加密 ...

  8. pbs "ll: command not found"

    可以用  ls -ltr   替代 ll

  9. LongestValidParentheses, 求最长合法括号子串长度-----同类问题ValidParentheses,GenerateParentheses

    问题描述:求括号字符串中最长合法子串长度.例如:()((),返回2,而不是4. 算法分析:还是利用栈,和判断合法括号对是一样的. public static int longestValidParen ...

  10. 使用Executor管理Thread对象详解

    java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法.使用Executor管理Thread对象可以简化并发编程. Executor ...