一句话,他们之间应该是没关系的(不是一个层次上的东西)。即 JVM的执行指令 看不到 线程与working memory, main memory 交互
public class StudentBean {
private int studentID;
public void changeStudentID(int addStep){
int newID = studentID + addStep;
studentID = newID;
}
public static void main(String[] args) {
StudentBean sbean = new StudentBean();
sbean.changeStudentID(10);
}
}
当线程调用的方法 changeStudentID(int addStep) 从而使用 mySbean.studentID时
1. 从 线程与working memory, main memory交互 的角度看,有下面这些动作流(较低层次,此层对于JVM的指令都是透明的)
main memory read(一开始,从main memory读取)-->线程load-->线程use-->线程assign(给myObject.studentID赋新值)-->线程store-->main memory write(最终存储到 main memory啦)
注意:这里的动词 read, load, use, assign, store, write都是JVM定义的动作,并不是JVM的指令,即不是iload_0, istore_2式的指令
2. 从线程的JVM指令 角度,执行了下面的指令(更高层次,此层次看不到 JVM 与 working memory, main memory 交互)
// Java 字节码
public void changeStudentID(int);
Code:
Stack=2, Locals=3, Args_size=2
0: aload_0 // 将 this 压入 operand stack
1: getfield #2; //Field studentID:I
// 弹出刚刚压入的 this 引用,得到 studentID的值,并将此值压入栈
// 为什么可以得到studentID, 因为getfield操作码后面其实是还有操作数的
// 根据那个操作数,可以到常量池中取到field信息,从而,得到 studentID)
4: iload_1 //将 local variables中的 1 位置上的 int 值压入栈
5: iadd // 从 栈中弹出两个值,相加,然后将结果压入栈
6: istore_2 // 从栈中弹出一个值,并存储到 local variables 的 第 2 位置上
7: aload_0 // 从local variables的 0 位置上,将this 引用压入栈
8: iload_2 // 从local variables的 2 位置上,将int 值压入栈
9: putfield #2; //Field studentID:I
// 弹出栈顶的两个元素(最上面的是int值,然后是this 引用),将 int 值
// 赋给 this 的studentID
// 为什么可以得到studentID, 因为putfield操作码后面其实是还有操作数的
// 根据那个操作数,可以到常量池中取到field信息,从而,得到 studentID
// ,然后就可以把int 赋值给studentID啦)
12: return //此方法返回
LineNumberTable:
line 6: 0
line 7: 7
line 8: 12