线程与working memory, main memory交互 和 JVM的执行指令 的关系

一句话,他们之间应该是没关系的(不是一个层次上的东西)。即 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值