字节码指令简介
Java虚拟机的指令由一个字节长度的、代表某种特定操作含义的数字(操作码)以及跟随其后的零至多个代表此操作所需的参数(操作数)而构成。
Java虚拟机采用面向操作数栈而不是寄存器的架构,因此大多数指令不包含操作数
Class文件格式放弃了长度对齐,处理超过一个字节的数据时,不得不在运行时从字节中重建具体数据的结构。尽管需要解释执行字节码时损失一些性能,但是可以节约很多空间。
字节码与数据类型
在Java虚拟机的指令集中,大多数指令都包含了其操作所对应的数据类型信息。iload用于从局部变量表中加载int类型的数据到操作数栈中,fload加载float数据。两条指令的操作在虚拟机内部可能由同一段代码实现,但在Class文件中必须拥有各自独立的操作码。
对于大部分与数据类型相关的字节码指令,他们的操作码助记符中都有特殊注明专门为哪种数据类型服务。i代表int,l代表long等。
…待续
同步指令
monitor<enter/exit>
执行monitorenter指令时,首先要尝试获取对象的锁,如果对象没有被锁定,或者当前线程已经拥有了那个对象的锁,把锁的计数器+1。即是可重入的
执行monitorexit时将锁计数器-1,当计数器为0,锁就被释放。
如果对象获取对象锁失败,当前线程就要阻塞等待,直到对象锁被另一个线程释放为止。