2. Java内存模型

2017-03-27  本文已影响0人  进击的勇士

Java内存模型指定了JVM和计算机内存是如何进行协作

Java内存模型的原理

Java内存被分为线程栈和堆
栈:JVM中的每个线程拥有一个自己的线程栈,线程栈中包含当前调用方法的信息,所有被调用方法的本地变量。
堆:java应用程序中的所有对象,与线程无关。

JVM内存模型
public class MyRunnable implements Runnable() {

    public void run() {
        methodOne();
    }

    public void methodOne() {
        int localVariable1 = 45;

        MySharedObject localVariable2 =
            MySharedObject.sharedInstance;
        //... do more with local variables.
        methodTwo();
    }

    public void methodTwo() {
        Integer localVariable1 = new Integer(99);
        //... do more with local variable.
    }
}

public class MySharedObject {

    //static variable pointing to instance of MySharedObject

    public static final MySharedObject sharedInstance =
        new MySharedObject();

    //member variables pointing to two objects on the heap
    public Integer object2 = new Integer(22);
    public Integer object4 = new Integer(44);

    public long member1 = 12345;
    public long member1 = 67890;
}

硬件内存架构

电脑硬件架构

Java内存模型和硬件内存架构之间的桥接

共享对象的可见性

如果两个或者更多的线程在没有正确的使用volatile声明或者同步的情况下共享一个对象,一个线程更新这个共享对象可能对其它线程来说是不接见的。

共享对象的可见性

可以使用volatile关键字解决这个问题

race condition

如果两个或者更多的线程共享一个对象,多个线程在这个共享对象上更新变量,就有可能发生race conditions。

更新变量发生 race condition

可以使用同步块解决这个问题

上一篇 下一篇

猜你喜欢

热点阅读