今天在学习ArrayBlockQueue源码的时候有一个小疑惑 如代码:
/** The queued items */ final Object[] items; //实例变量 /** * Extracts element at current take position, advances, and signals. * Call only when holding lock. */ private E extract() { final Object[] items = this.items; E x = this.<E>cast(items[takeIndex]); items[takeIndex] = null; takeIndex = inc(takeIndex); --count; notFull.signal();
就是在代码的第9行:final Object[] items=this.items;
还有很多方法都是这种形式:在方法中要用到某个实例变量的时候采取的方法是先新建一个引用变量来引用原来的对象,而不是直接使用(这里即为this.items)。在网上查看了很多文章最后在iteye的问答区找到了答案
原链接http://www.iteye.com/problems/87918
它举了个例子
final Object[] items = new Object[10]; public void test() { if(items.length == 0) { } int i = items.length; } public void test2() { final Object[] items = this.items; if(items.length == 0) { } int i = items.length; }
然后javap一下,javap -p -c -s Test >> Test.log,得到如下代码:
public void test(); Signature: ()V Code: 0: aload_0 1: getfield #3 // Field items:[Ljava/lang/Object; 4: arraylength 5: ifne 8 8: aload_0 9: getfield #3 // Field items:[Ljava/lang/Object; 12: arraylength 13: istore_1 14: return public void test2(); Signature: ()V Code: 0: aload_0 1: getfield #3 // Field items:[Ljava/lang/Object; 4: astore_1 5: aload_1 //load 局部变量 items 6: arraylength 7: ifne 10 10: aload_1 // 这里少了getfield,因为aload_1 load的就是items 11: arraylength 12: istore_2 13: return
最终原因:两种写法唯一的区别,是getfield指令,getfield在对象内相对来说开销是比较廉价的,但前者(test方法)显然在代码可读性上,高出很多,如果不存在大量的实例变量引用,性能可以忽略不计,估计这也正是为什么JDK7采用这种简单的写法的原因吧。
重点在于 如果用 this.items 的话 字节码的表现是 aload_0,getfield 如果先复制的话 直接就是 aload_1;估计getfield 的效率比aload_1低所以才会这样使用。
由于我对这些JVM了解的还很少,欢迎各位指教,如果能推介一两本书籍深入了解JVM的话感激不尽!
相关推荐
ArrayBlockingQueue源码解析__动力节点共23页.pdf.zip
ArrayBlockingQueue源码分析.docx
今天小编就为大家分享一篇关于Java源码解析阻塞队列ArrayBlockingQueue常用方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
今天小编就为大家分享一篇关于Java源码解析阻塞队列ArrayBlockingQueue介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
今天小编就为大家分享一篇关于Java源码解析阻塞队列ArrayBlockingQueue功能简介,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了详细分析Java并发集合ArrayBlockingQueue的用法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下
主要介绍了java中LinkedBlockingQueue与ArrayBlockingQueue的异同,需要的朋友可以参考下
bitset源码Java源码分析 基础集合列表 ArrayList (done) Vector (done) LinkedList (done) Stack (done) ReferenceQueue (done) ArrayDeque (done) Set HashSet (done) TreeSet (done) LinkedHashSet (done) BitSet ...
在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的Condition实现的,但是JAVA类中提供了这项功能,是ArrayBlockingQueue, ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先...
java bitset 源码 最后更新于20180424 (Toc generated by ) 数据结构 队列 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。 阻塞队列:ArrayBlockingQueue(有界...
3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. ...
囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue(ArrayBlockingQueue、...
ArrayBlockingQueue是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素
java 队列使用,次例子是一个模拟网络爬虫工作大致流程的小例子,里面没有具体的爬取的实现,只是对爬取的流程的模拟,使用到了java 的 ArrayBlockingQueue、ConcurrentHashMap、 这2个类和java 的 volatile 关键字...
数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 PriorityBlockingQueue 7. 同步队列 SynchronousQueue 8. 阻塞双端队列 BlockingDeque 9. 链...