JVM 编程(Oolong)学习笔记
近期学习Engel的《Programming for the Java Virtual Machine》。这本书实际上讲的是JVM原理和机制,只不过用一种汇编语言的形式来展开讲解。Oolong是大牛Engel先生自己发明的一种基于JVM的汇编语言,按他自己的介绍,Oolong实际只是JVM bytecode的一个易于理解的教学版本,其本身似乎并不具备什么开发应用的价值。
由于对jvm本身已经有一定的熟悉,所以这里没有什么详细的笔记可做,仅就书中一些比较迷惑的地方做一些说明。
数组操作:
对数组元素的写操作,书中有个例子在1.5以上的jvm中是错的:
经过试验发现,数组元素替换的压栈顺序错了,正确的应该如下:;最初,lock_count = 0aload_0monitorenter ;mainLock()上锁, lock_count = 1aload_0monitorenter ;subLock1()上锁, lock_count = 2;做点什么1aload_0monitorexit ;subLock1()解锁, lock_count = 1aload_0monitorenter ;subLock2()上锁, lock_count = 2;做点什么2aload_0monitorexit ;subLock2()解锁, lock_count = 1aload_0monitorexit ;mainLock()解锁, lock_count = 0
可见,每执行一次monitorenter,lock_count就增加1;每执行一次monitorexit,lock_count就减少1。
JVM规定,只有当lock_count = 0 时,别的线程才有机会获得锁。因此,在subLock1()和subLock2()之间不可能有其它的线程介入,mainLock()与subLock1()和subLock2()所持都是同一个锁。