同事讨论一道面试题,是ArrayBlockingQueue里代码
问题是326行是多余的吗,所在意义是什么?
因为是jdk源码,肯定有意义的,面试题也有答案。
第二个原因,为了安全,我们很容易一致同意。
问题在于原因一解释,为什么变成读方法里局部变量是一条指令,读类的成员变量是两条指令,所以性能优化。
找了相关文章,编译测试一下.
编译一下,再去target/classes 目录下执行命令
javap -p -c -s DemoTest >> DemoTest.log
结果如下
Compiled from "DemoTest.java"
public class DemoTest {
final java.lang.Object[] items;
descriptor: [Ljava/lang/Object;
public DemoTest();
descriptor: ()V
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 10
7: anewarray #2 // class java/lang/Object
10: putfield #3 // Field items:[Ljava/lang/Object;
13: return
public void test();
descriptor: ()V
Code:
0: aload_0 //这是items.length,第六6行获取items,分别调用aload_0,getfield ,两条指令
1: getfield #3 // Field items:[Ljava/lang/Object;
4: arraylength
5: ifne 8
8: aload_0 //这是items.length,第9行获取items,分别调用aload_0,getfield ,两条指令
9: getfield #3 // Field items:[Ljava/lang/Object;
12: arraylength
13: istore_1
14: return
public void test2();
descriptor: ()V
Code:
0: aload_0 // 这是this.tems,第13行获取items,分别调用aload_0,getfield ,两条指令
1: getfield #3 // Field items:[Ljava/lang/Object;
4: astore_1
5: aload_1 //这是tems.length,第14行获取items,调用aload_1,区别aload_0(因为final Object[] items 方法局部变量),一条指令
6: arraylength
7: ifne 10
10: aload_1 //这是tems.length,第17行获取items,调用aload_1(final Object[] items 方法局部变量),一条指令
11: arraylength
12: istore_2
13: return
}
可以看出test2()方法第一次还是两条指令,传引用局部变量,后面确实变成了一条指令.
总结:很多问题不要死记,编译一下,大部分是语法糖问题。