总线锁.缓存锁.MESI缓存一致性协议.CPU 层面的内存屏障 1.JMM定义: Java Memory Model(java内存模型)是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体平台的统一的保证.(可能在术语上与Java运行时内存分布有歧义,后者指堆.方法区.线程栈等内存区域). 1.1.多线程开发需要注意的问题: 原子性 即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执. 可见性 可见性是指当多个线程访问同…
原子性: 原子性就是指该操作是不可再分的.不论是多核还是单核,具有原子性的量,同一时刻只能有一个线程来对它进行操作.简而言之,在整个操作过程中不会被线程调度器中断的操作,都可认为是原子性.比如 a = 1: 非原子性: 也就是整个过程中会出现线程调度器中断操作的现象 类似"a ++"这样的操作不具有原子性,因为它可能要经过以下两个步骤: (1)取出 a 的值 (2)计算 a+1 如果有两个线程t1,t2在进行这样的操作.t1在第一步做完之后还没来得及加1操作就被线程调度器中断了,于是t…
今天闲来无事来,看一下Java中的内存模型和垃圾回收机制的原理.关于这个方面的知识,网上已经有非常多现成的资料能够供我们參考,可是知识还是比較杂的,在这部分知识点中有一本书不得不推荐:<深入理解Java虚拟机>,如今已经是第二版了.这本书就从头開始详细介绍了Java整个虚拟机的模型以及Java的类文件结构,载入机制等.这里大部分的知识点都是能够在这本书中找到的,当然我是主要还是借鉴这本书中的非常多内容的.以下就不多说了.进入主题吧. 首先来看一下Java中的内存模型图: 第一.程序计数器(PC…
一.前言 本文的主要工作:尝试以时间顺序追踪一遍 Java 执行的整个过程,以及展示 JVM 中内存模型的相应变化. 本文的主要目的:希望能够通过 Java 执行过程的冰山一角,增进对编程语言工作原理的理解. 以下面这段代码为例,追踪它的执行过程: public class Car { private int speed; public void setSpeed(int speed) { this.speed = speed; } public void getSpeed() { System…
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是如何实现的,以及高效并发. 1.Java内存模型 CPU在运行的时候,不可能把所有的东西都放在寄存器里面,所有需要使用内存.这个内存就是我们知道的那个内存. 但是实际情况是,内存的读写速度于CPU的指令操作差了几个数量级.所以为了跟高效的使用CPU,就有高速缓存这么一个东西. 以下是Intel 酷睿…
八 Java内存模型与线程   1 Java内存模型     ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.     ---此处的变量和Java中的变量有所区别,它包括类字段.实例字段和构成数组对象的元素,但不包括局部变量和方法参数.     ---Java内存模型规定:         · 所有的变量都存储在主内存中:         · 每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副拷贝,线程对变…
对于每一种编程语言,理解它的内存模型是理所当然的重要.下面我们从jvm的内存模型来体会下java(不限java语言,严格来讲是JVM内存模型,所有JVM体系的变成语言均适用)的内存模型. 堆: 就是我们写程序new出来的对象存放的内存. 方法区:就是存放类字节码和常量的内存. 虚拟机栈:就是局部变量(方法内定义的变量以及方法的入参.返回值),线程栈的内存. 本地方法区: 就是jvm本地调用时使用的内存. 程序计数器:就是程序运行到字节码哪行的指示器的内存. 好了,看如下一段代码: 当我们执行上面…
一.通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码.这段代码的逻辑很简单:主线程启动了两个子线程,一个线程1.一个线程2.线程1先执行,sleep睡眠2秒钟之后线程2执行.两个线程使用到了一个共享变量shareFlag,初始值为false.如果shareFlag一直等于false,线程1将一直处于死循环状态,所以我们在线程2中将shareFlag设置为true. public class VolatileTest { public static boole…
一.JMM(java memory model)内存模型 从网上淘来二张图: 上面这张图说的是,在多核CPU的系统中,每个核CPU自带高速缓存,然后计算机主板上也有一块内存-称为主内(即:内存条).工作时,CPU的高速缓存中的数据通过一系列手段来保证与主内的数据一致(CacheCoherence),更直白点,高速缓存要从主内中load数据,处理完以后,还要save回主存. 上图说的是,java中的各种变量(variable)保存在主存中,然后每个线程自己也有自己的工作内存区(working me…
1. 概述 Java 内存模型即 Java Memory Model,简称 JMM.从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系,线程之间的共享变量存储在主内存中,每个线程都有一个私有的工作内存,工作内存中存储了该线程以读/写共享变量的副本.工作内存是 JMM 的一个抽象概念,并不真实存在.它涵盖了缓存.写缓冲区.寄存器以及其他的硬件和编译器优化. Java内存模型是跟cpu缓存模型是类似的,基于cpu缓存模型来建立的Java内存模型,只不过Java内存模型是标准化的,屏蔽掉底层不…