BlockingQueue各实现队列及主要方法

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就是随便乘的,扩大一下旋转次数,没有特别的根据。

 

未完待续。。。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值