面试总结day2:线程池阻塞队列、RabbitMQ重复消费问题、synchronize和分布式锁

1.线程池阻塞队列分类:

**1.ArrayBlockingQueue 数组型阻塞队列
2.LinkedBlockingQueue 链表型阻塞队列
3.DelayQueue 延时队列
4.SynchronousQueue 同步队列
5.PriorityBlockingQueue 优先阻塞队列**	

ArrayBlockingQueue 数组型阻塞队列
特点:
初始化一定容量的数组
使用一个重入锁,默认使用非公平锁,入队和出队共用一个锁,互斥
是有界设计,如果容量满无法继续添加元素直至有元素被移除
使用时开辟一段连续的内存,如果初始化容量过大容易造成资源浪费,过小易添加失败
LinkedBlockingQueue 链表型阻塞队列
特点:
内部使用节点关联,会产生多一点内存占用
使用两个重入锁分别控制元素的入队和出队,用Condition进行线程间的唤醒和等待
有边界的,在默认构造方法中容量是Integer.MAX_VALUE,非连续性内存空间
DelayQueue 延时队列
特点:
无边界设计
添加(put)不阻塞,移除阻塞
元素都有一个过期时间
取元素只有过期的才会被取出
SynchronousQueue 同步队列
特点:
内部容量是0
每次删除操作都要等待插入操作
每次插入操作都要等待删除操作
一个元素,一旦有了插入线程和移除线程,那么很快由插入线程移交给移除线程,这个容器相当于通道,本身不存储元素在多任务队列,是最快的处理任务方式。
PriorityBlockingQueue 优先阻塞队列
特点:
无边界设计,但容量实际是依靠系统资源影响
添加元素,如果超过1,则进入优先级排序

2.RabbitMQ重复消费问题

解决:是个消息设置唯一id在redis中进行setnx,如果存在说明已经消费过了,如果不存在说明还没有消费.

3.分布式锁和synchronize的区别

1.synchronized是基于JVM,在分布式部署多台实例的情况下,不能实现功能
为什么分布式场景使用synchronized依然会出现线程安全问题?
**因为synchronized是JVM进程级别的锁,由于分布式部署原因,同样的synchronized代码块内容在不同的服务器(tomcat1和tomcat2)运行时,抢占的不是同一把锁。**所以当多个请求通过Nginx分发到不同的tomcat服务器,此时synchronized没办法保证线程安全问题,因为图中这两台tomcat上的synchronized使用的不是同一个锁,就没办法保证线程安全,这时就需要使用分布式锁!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值