Java 并发编程

Java 线程的工作内存的理解

  • Java 内存模型
    • 1、抽象的工作内存如何理解
    • 2、代码验证

Java 内存模型

java 内存模型简称JMM: java 线程之间的共享变量存在于主内存之中,每个线程都有自己的私有本地内存(工作内存,抽象真实不存在),本地工作内存存储了线程读/写共享变量的副本;

1、抽象的工作内存如何理解

新建一个线程,子线程是父线程的一个拷贝,子线程获得父线程堆、栈等信息,为了节省内存资源,子线程会采取读时共享写时复制的原则;所以子线程工作内存应该存储了子线程本身的栈信息,以及从父线程中复制而来的信息,子线程操作共享变量(不仅基本类型还包括引用类型)只会修改自身拷贝的那份,不会影响父线程及其他子线程;

2、代码验证

public class VolatileDemo {
    private static Person person = new Person(10, 0);
    public static void main(String[] args) {
        new Thread(() ->{
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (Exception e) {e.printStackTrace();}
            person.setAge(20);
            System.out.println("age:" + person.getAge() + ", sex:" + person.getSex());
        }).start();
        while (person.getAge() < 20){
        }
        System.out.println("age:" + person.getAge() + ", sex:" + person.getSex());
    }

}

class Person {
    int age;
    int sex;
    public Person(int age, int sex) {
        this.age = age;
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
}

1、当共享变量 person 没有添加 volatile 修饰,主线程会一直执行 while 循环;
2、当共享变量 person 添加 volatile 修饰或者 person 的 age 字段添加 volatile 修饰,线程能够正常执行完;

你可能感兴趣的:(Java,并发编程,并发编程,工作内存)