Java内存模型与volatile学习笔记

volatile 理解

  1. volatile是Java虚拟机里面的轻量级的同步机制
  2. 保证可见性
  3. 不保证原子性
  4. 禁止指令重排序

Java 内存模型

Java虚拟机的规范中定义了什么是Java内存模型(Java Memory Model,JMM)数据库

Java内存模型自己是一种抽象的概念,也并不实体存在,它描述的是一组规则或者规范,经过这组鬼覅按,定义了程序中各个变量(包括实力字段,静态字段和构成素组对象的元素)的访问方式。它是用于屏蔽掉各类硬件与操做系统内存之间的访问差别,从而实现让Java程序在各类平台下均可以作到同样的运行效果,Java内存模型规范了Java虚拟机与计算机内存是如何协同工做,规定了一个线程应该如何以及何时能够看到其余线程修改后的共享变量的数据,以及如何同步访问共享变量。旧版本的Java内存模型并不完善,所以Java内存模型在Java 1.5时被从新修订。如今使用的Java 1.8也仍旧沿用着1.5的内存模型。并发

JMM关于同步的规定:spa

  1. 线程解锁前,必须把共享变量的值刷新到主内存
  2. 线程加锁前,必须读取主内存的最新的值到工做内存
  3. 加锁解锁是同一把锁

介于JVM运行程序的是基于线程的,且每一个线程都会拥有本身的一个工做内存,工做内存就是当前线程的私有数据空间,其余线程不可访问,而Java内存模型中同时规定全部数据都必须存储在主内存,主内存是公共的内存区域,全部的线程均可以访问,但线程对数据的读取,赋值等必须在各自的工做内存中进行。不能够直接操做主内存。所以,首先须要将数据从主内存复制到本身的工做内存,而后对数据进行操做,操做完成后再将新数据写回主内存,不能直接操做主内存中的变量,各个线程中的工做内存中存储着主内存的数据副本,所以不一样的线程件没法访问其余线程的工做内存,线程间的通讯必须经过主内存来完成。操作系统

Java内存模型是围绕着在并发过程当中如何处理原子性、可见性和有序性这三个特征来创建的。线程

  1. 原子性:对数据的操做是具有原子性的。有点像数据库中的事务。读取,修改,写入时一鼓作气,不可分割。synchronized代码块的操做也时原子性的。
  2. 可见性:Java内存模型是经过在数据修改后将新数据同步回主内存,当一个线程修改后,是否会通知其余线程该数据已修改,导致其余线程在操做前会从主内存从新刷新数据值的过程称之为可见性。除了volatile以外,synchronized和final关键字也实现了可见性。final修饰的字段在构造器中一旦初始化完成,那在其余线程中就能看到final字段的值。
  3. 有序性:线程内表现为串行的语义,不一样线程之间存在指令重排序,即两个不相关的变量赋值的前后顺序并不影响单线程的运算结果,从而编译器会对操做的变量进行从新排序。Java中提供了volatile和synchronized两个关键字来保证线程之间操做的有序性。
相关文章
相关标签/搜索