Java 内存模型

方法内部中的变量存在栈上

如果两个线程同时调用同一个对象上的同一个方法,他们将会都访问这个对象的成员变量,但是每一个线程都拥有了成员变量的私有拷贝,

  • 如果你的程序是多线程的,那么每个CPU得每个线程是可能存在并发执行得。
  • CPI Registers 寄存器,CPU访问寄存器的首都远大于储存
  • CPU Cache Memory CPU高速缓存,由于寄存器读写性能流弊,不得已设计出高速缓存来配合寄存器
  • Main Memory 主内存

Java内存模型 - 同步操作与规则:
同步的8种基本操作

import java.util.Random;

public class MemoryModelTester {

  int x, y, x_read, y_read;

  private Thread createThread1() {
    return new Thread(
        new Runnable() {
          @Override
          public void run() {
            try {
              Thread.sleep(new Random().nextInt(10));
            } catch (InterruptedException e) {
              throw new RuntimeException(e);
            }
            x = 1;
            y_read = y;
          }
        });
  }

  private Thread createThread2() {
    return new Thread(
        new Runnable() {
          @Override
          public void run() {
            try {
              Thread.sleep(new Random().nextInt(10));
            } catch (InterruptedException e) {
              throw new RuntimeException(e);
            }
            y = 1;
            x_read = x;
          }
        });
  }

  public static void main(String[] args) throws InterruptedException {
    while (true) {
      MemoryModelTester modelTester = new MemoryModelTester();
      Thread thread1 = modelTester.createThread1();
      Thread thread2 = modelTester.createThread2();
      thread1.start();
      thread2.start();

      thread1.join();
      thread2.join();

      String print = String.format("(%d, %d)", modelTester.x_read, modelTester.y_read);
      System.out.println(print);
      if (modelTester.x_read == 0 && modelTester.y_read == 0) {
        throw new RuntimeException("Error");
      }
    }
  }
}

ThreadLoca