Java内存模型与线程_学习笔记

深入理解java虚拟机:

1、java内存模型

java虚拟机规范中试图定义一种Java内存模型。Java Memory Model(JMM)

1.1 主内存与工作内存

java内存模型规定所有的变量都存储在主内存中(Main Memory)中。

每个线程还有自己的工作内存(working Memory),线程的工作内存保存了该线程使用到的变量的主内存副本拷贝,线程对变量的操作都在工作内存中,而不能直接读写主内存中的变量。

1.2 内存见交互操作

1.3 volatile变量的特殊规则

保证对所有线程有可见性

禁止指令重排优化

1.4对于long和double型变量的特殊规则

JMM要求1.2中的8个操作具有原子性,但是对于64位数据类型(long double)

允许虚拟机将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作来进行。

即不保证64位数据类型 load store read write这4个操作的原子性。

所有当有多个线程共享未声明位volatile的long或double类型的变量,某些线程就会读到“半个变量”的数值。

1.5 原子性 可见性 有序性

原子性:read,load,assign,use,write,synchronized之间的操作

可见性:当一个线程修改了某个变量,其他线程能够立刻得知这个修改。

     volatile,synchronized,final均有可见性

     同步块的的可见性在于,一个变量执行unlock之前,必须先把此变量同步回主内存中。

有序性:如果在本线程中观察,所有的操作都是有序的。如果在一个线程中观察另一个线程,所有操作都是无序的。

前半句是指:线程内表现为串行语义

后半句是指:指令重排,工作内存与主内存同步延迟

1.6 先行发生原则

时间先后顺序与先行发生原则之间基本没有太大关系,所以当我们衡量并发安全问题的时候不要收到时间顺序的干扰,一切必须按照先行发生原则为准。

2 Java与线程

2.1 线程的实现

线程式比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址,文件I?O),又可以独立调度。(线程式CPU调度的基本单位)

实现线程有三种方法:

1、使用内核线程实现

内核线程 Kernel-level Thread,KLT    直接由操作系统内(Kernel)支持的线程。内核通过操纵调度器(Scheduler)对线程进行调度,并将线程的任务映射到各个处理器上。

支持多线程的内核叫多线程内核 multi-Threads kernel

程序不会直接使用内核线程,而且使用内核线程的一种高级接口---轻量级进程 Light Weight Process  LWP

由于内核线程的支持,每个轻量级进程都成为一个独立的调度单位,及时有一个轻量进程在系统中阻塞,也不会影响到整个进程的工作。

局限性:基于内核线程实现,各种线程操作,例如创建,析构及同步,都需要进行系统调用。

系统调用的代价享队较高,需要在用户态(User Mode)和内核态(Kernel Mode)中来回切换。其次,轻量进程需要下号一定的内核资源,因此一个系统支持轻量级进程的数量是有限的。

2、使用用户线程实现

广义上来讲,一个线程只要不是内核线程,就可以认为是用户线程(User Thread),从这个定义来讲,轻量级进程也属于用户进程。

狭义上用户线程指的是完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现。

如果程序实现得当,这种线程不需要切换到内核态,因此操作可以是非常快速且低消耗的,也可以支持规模更大的线程数量,部分高性能数据库中的多线程就是有用户线程实现的。

由于操作系统只能把处理器资源分配到进程,诸如“阻塞如何处理”,“多处理器系统中如何将线程映射到到其他处理器”,这类问题解决起来异常困难,甚至不可完成。

因而使用用户线程实现的程序一般都比较复杂。

3.使用用户线程加轻量级进程混合实现

操作系统提供支持的轻量级进程作为用户线程和内核线程之间的桥梁,这样内核提供的线程调度功能及处理器映射,并且用户线程的系统调用要通过轻量级线程来完成,降低整个进程被完全阻塞的风险。

用户线程与轻量级进程的数目比也不一定 N:M

2.2、Java线程的实现

 2.3、java线程调度

线程调度是指系统为线程分配处理器使用权的过程

协同式线程调度

抢占式线程调度

Java线程调度式系统自动完成的,但是建议给线程设置优先级。

状态转换:

Waiting:处于这个状态的线程不会被分配CPU执行时间,他们要等待被其他线程显示地唤醒。

Timed Waiting:处于这个状态的线程不会被分配CPU执行时间,无须等待其他线程显示唤醒。在一定时间之后会由系统自动唤醒。

Blocked(阻塞):程序等待进入同步区域的时候,线程处于这种状态。

原文地址:https://www.cnblogs.com/L-a-u-r-a/p/8576365.html

时间: 2024-08-04 12:06:16

Java内存模型与线程_学习笔记的相关文章

[笔记]JAVA内存模型与线程

JAVA线程  工作内存  主内存 java内存模型中的八种操作: lock    unlock    read     load     use      assign      store     write 八种基本操作必须满足的规则 volatile 当一个变量被定义成volatile之后,它将具备两种特性 一是保证此变量对所有线程的可见性("可见性"是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的.) 二是禁止指令重排序优化(普通的变量仅仅会保证在该方法

jvm(12)-java内存模型与线程

[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计算机性能发展源动力的根本原因: 2)Amdahl 定律:该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力: 3)摩尔定律:该定律用于描述处理器晶体管数量与运行效率间的发展关系: Conclusion)这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展

java内存模型与线程(转) good

java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_all.htm http://www.cnblogs.com/skywang12345/p/3447546.html 计算机的CPU计算能力超强,其计算速度与 内存等存储 和通讯子系统的速度相比快了几个数量级, 数据加载到内存中后,cpu处理器运算处理时,大部分时间花在等待获取去获取磁盘IO.网络通

Java并发程序设计(三) Java内存模型和线程安全

Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗?  二.有序性 Java代码在执行使,并不一点会按照编写程序的语义顺序执行(为了优化性能).具体不做解释. 三.可见性 可见性是指一个线程修改了一个共享变量的值,其他线程能否立即知道这个修改. 编译器优化硬件优化(如写吸收,批操作) Java虚拟机层面的可见性  public class VisibilityTest ext

深入理解java虚拟机-第12章Java内存模型与线程

第12章 Java内存模型与线程 Java内存模型  主内存与工作内存: java内存模型规定了所有的变量都在主内存中,每条线程还有自己的工作内存. 工作内存中保存了该线程使用的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行. 内存间交互操作: 1 lock 作用于主内存的变量,它把一个变量标识为一个线程独占的状态. 2 unlock 作用于主内存的变量,把锁定的变量释放出来 3 read 作用于工作内存的变量,把一个变量的值从主内存传输到线程的工作内存中. 4 load 作用于工作

(Java多线程系列七)Java内存模型和线程的三大特性

Java内存模型和线程的三大特性 多线程有三大特性:原子性.可见性.有序性 1.Java内存模型 Java内存模型(Java Memory Model ,JMM),决定一个线程对共享变量的写入时,能对另一个线程可见.从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本.本地内存是JMM的一个抽象概念,并不真实存在. 用一张图表示

深入理解Java虚拟机- 学习笔记 - Java内存模型与线程

除了在硬件上增加告诉缓存之外,为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另外一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证.与处理器的乱序优化执行类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction

Java内存模型与线程

写在前面:与之前主流程序语言(c/c++等)直接使用物理硬件和操作系统的内存模型不同,java虚拟机为了屏蔽各种硬件和操作系统的内存访问差异定义了一种java内存模型.其主要定义程序中各个变量的访问规则(在虚拟机中将变量存储到内存和从内存中取出变量的底层细节). 线程.主内存.工作内存之间的交互关系 1.java内存模型结构: -所有的变量都存储在主内存中. -每条线程还有自己的工作内存. -工作内存中保存了从主内存中拷贝的该线程所要使用到的变量 -每条线程对变量的操作必须在自己的工作内存中,不

011 Java内存模型与线程

1.Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果. Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节. ①主内存与工作内存 Java内存模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时的主内存名字一样,两者也可以互相类