面试常见的队列比较ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue,编程中常用的ArrayBlockingQueue,LinkedBlockingQueue是这两个,现在记录下我面试遇到的ArrayBlockingQueue问题,
1.ArrayBlockingQueue是无锁的吗?答:ArrayBlockingQueue是 有界阻塞队列。
2.ArrayBlockingQueue为什么实现是阻塞队列?能像LinkedBlockingQueue的实现是无锁的吗?
ArrayBlockingQueue为什么实现是阻塞队列,我谷歌到了一部分资料:
http://jsr166-concurrency.10961.n7.nabble.com/ArrayBlockingQueue-concurrent-put-and-take-tc1306.html
大致意思是 1.主要是因为迭代器实现的复杂,并且在复杂性和性能增益之间进行权衡。
2.Doug Lea可能并不觉得Java需要支持2个不同的BlockingQueues。
针对ArrayBlockingQueue迭代器我有重新看了下代码和注释,ArrayBlockingQueue所有的迭代器共享数据,队列改变会影响所有的迭代器。为了保证正确,增加了许多复杂的操作。Itr是实现了Iterator接口的类,Itrs负责管理Itr,并且Itrs的Node继承了弱引用,出对dequeue()和删除remove()都对Itrs进行了操作,并不会对Itrs进行源码分析,谷歌搜下很多文章。
反观LinkedBlockingQueue的迭代器又个疑问,它取出的数据可能是旧的?我不确定是设计如此还是源码我看错了,先上代码,hasNext方法:
next方法:
看截图next方法每次返回的数据是currentElement,而下一个数据也是在next方法取出,我并没有找到其他方法更新currentElement,同样也没找到像ArrayBlockingQueue的管理迭代器的类Itrs。希望有经验的大佬帮忙告知下。
针对ArrayBlockingQueue能实现无锁吗,能,上面的链接就有别人写好无锁ArrayBlockingQueue的代码,有兴趣看下,针对下一篇记录map面试,提前说下常遇到的问题,
1.hashmap数据结构?是线程安全吗?为什么不是线程安全?为什么用黑红树?和avl树比有什么优缺点?
2.ConcurrentHashMap数据结构?怎样实现线程安全的?jdk1.8比1.7有什么改变?get为什么不加锁?可以实现无锁吗?迭代器是强一致还是弱一致?等等我在想想。