面试题ArrayBlockingQueue优化问题

同事讨论一道面试题,是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()方法第一次还是两条指令,传引用局部变量,后面确实变成了一条指令.

总结:很多问题不要死记,编译一下,大部分是语法糖问题。

参考文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值