Java并发学习笔记-基础篇2-Java内存模型

Java内存模型是什么?

JMM (java memory model)Java内存模型站在程序要的角度可以理解为一种规范,规范了JVM如何按需提供禁用缓存和指令优化的方法
具体包括以下:

  • volatile
  • synchronized
  • finnal
  • 6项happen-before规则

happen-before规则是什么?

前一个操作的结果对后续操作是可见,并不是指先后顺序

程序的顺序规则

单线程中,前一个操作happen-before于它后续的所有操作

volatile

对一个volatile变量的写操作happen-before于对他的读操作

传递性

A happen-before 于B, B happen-before 于C,则 A happen-before 于C,

如下图:


public class VolatileDemo {

   private int value;
   private volatile boolean  falg=false;


   public void write(){
      value=42;
      falg=true;
   }

   public void reader(){
       if(falg==true){
           //System.out.println("falg:"+falg);
           System.out.println("value:"+value);
       }
   }
   public static void main(String[] args) throws InterruptedException {
           VolatileDemo vd=new VolatileDemo();
           new Thread(()->{
               vd.write();
           },"t1").start();
           new Thread(()->{
               vd.reader();
           },"t2").start();
   }
}

synchronized

对一个锁的解锁happen-before于后续对这个锁的加锁。

可以这么理解,假设X变量的初始值是10,线程A执行代码块之后,对X进行了写操作,x=12,执行完之后自动释放锁,线程B进入代码块开始执行,线程B可以看到线程A对变量X的操作,即变量值为12.

start()规则

线程A启动线程B,线程B可以看到线程A调用B.star()之前所有的操作
eg :

join()规则

主线程A等待子线程B完成,主线程A可以看到子线程B对共享变量的所有操作。

eg:

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页