1、LinkedBlockQueue和ArrayBlockingQueue的区别
1)数据结构不同
ArrayBlockingQueue内部是通过一个数组实现的;
LinkedBlockQueue内部是通过一个单向链表实现的;
2)锁机制不同
ArrayBlockingQueue中只有一把锁,无法实现读写分离;
LinkedBlockQueue中有两把锁,一把takeLock,一把putLock,读写互不干扰,可 实现读写分离;
3)构造方法不同
ArrayBlockingQueue创建时必须制定长度;
LinkedBlockQueue可以不制定长度,默认长度为Integer.MAX_VALUE
2、SynchronousQueue相比其他两个队列有什么缺点
1)效率低
LinkedBlockQueue和ArrayBlockingQueue在添加元素时,只要队列不满,就不会阻塞线程,可以一直添加;取出元素时只要队列不为空也不会阻塞线程,可以直接取;SynchronousQueue必须交换数据后线程才会被唤醒,不管是存还是取,必须与另一个线程交换数据,否则会一直被阻塞;
2)会占用大量CPU
高并发时,若存取的模式严重不平衡,就会使大量同一种模式的线程不停的自旋,造成CPU升高;
3、offer和add有什么区别
1)通过add方法向队列中添加任务时,若队列已满会抛出异常
2)通过offer向队列中添加任务时,若队列已满会返回false,不会抛出异常
4、 poll和take有什么区别
1)take方法从队列头部取元素,取不到会阻塞线程;
2)poll方法也是从队列头部取元素,取不到则返回null;
另外poll方法也有重载方法,可以指定阻塞时间和阻塞时间单位,阻塞时间到还没取到元素则返回null;
5、SynchronousQueue中maxTimedSpins和maxUntimedSpins初始值的用意
1)maxTimedSpins:在定时等待中阻塞前旋转的次数;
根据官方解释,这个值是根据经验得出的,这个值在处理器超过2个后,不随处理器的数量变化。
2)maxUntimedSpins:在不定时等待中阻塞前旋转的次数;
这比计时值大,因为无计时等待旋转更快,因为它们不需要检查每次旋转的时间。所以这个16就是随便乘的,扩大一下旋转次数,没有特别的根据。
未完待续。。。