Java并发编程的暗自努力(五)Java内存模型,java模型
分享于 点击 16987 次 点评:2
Java并发编程的暗自努力(五)Java内存模型,java模型
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的模型。
Java内存模型规定了如何、何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量
Java内存模型内部原理
Java内存模型把Java虚拟机内部划分为线程 栈 和 堆
栈
- 每一个运行在Java虚拟机里的线程都拥有自己的线程栈
- 一个线程创建的本地变量对其他线程不可见
所有原始类型的本地变量都存放在线程栈上,因此对其他线程不可见。一个线程可能向另一个线程传递一个原始类型变量的拷贝,但是它不能共享这个原始类型变量本身
堆
堆上包含了在Java程序中创建的所有对象(无论时哪个对象创建的)。包括原始类型的对象版本。如果一个对象被创建然后赋值给一个局部变量,或者用来作为另一个对象的成员变量,这个对象仍然时存放在堆上
- 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上
- 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用存放在线程栈上,但是对象本身存放在堆上。
- 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上
- 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型
- 静态成员变量跟随着类定义一起也存放在堆上。
两个线程拥有一些列的本地变量。其中一个本地变量(Local Variable 2)执行堆上的一个共享对象(Object 3)。这两个线程分别拥有同一个对象的不同引用。这些引用都是本地变量,因此存放在各自线程的线程栈上。这两个不同的引用指向堆上同一个对象。
注意,这个共享对象(Object 3)持有Object2和Object4一个引用作为其成员变量(如图中Object3指向Object2和Object4的箭头)。通过在Object3中这些成员变量引用,这两个线程就可以访问Object2和Object4。
这张图也展示了指向堆上两个不同对象的一个本地变量。在这种情况下,指向两个不同对象的引用不是同一个对象。理论上,两个线程都可以访问Object1和Object5,如果两个线程都拥有两个对象的引用。但是在上图中,每一个线程仅有一个引用指向两个对象其中之一。
导致上图的Java代码:
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内存模型和硬件内存架构之间的桥接
相关文章
- 暂无相关文章
用户点评