《Java并发编程实战》3.活跃性、性能与测试

十、避免活跃性危险

1)死锁

    死锁的产生:A线程持有锁1,尝试获取锁2,同时B线程持有锁2,尝试获取锁1。

    避免死锁:使用支持定时的锁;控制锁顺序;多个锁转为1个锁。jstack -l pid可查看死锁。

2)饥饿

    某个线程一直获取不到它所需要的资源,导致线程饥饿。常见的是cpu饥饿,一般不设置线程的优先级(因为本身也不是很靠谱)。

3)活锁

    因为某些原因导致线程一直执行一个重复的操作。例如MQ的消费消息失败导致消息放回了MQ,然后又被消费到,如此循环。可以适当设置重试策略防止这种事情发生,例如可以重试3次,如果还是成功不了,则放到通知队列进行告警。

 

十一、性能与可伸缩性

1)线程引入的开销

  • 上下文切换:线程切换时,线程所需要的数据可能不在处理器的本地缓存。

  • 内存同步:内存栅栏会使缓存失效。

  • 阻塞:两次上下文切换,用户态与内核态切换。

2)减少锁竞争

  • 缩小锁的范围。能所一个代码块,就不锁一整个方法。

  • 减少锁粒度。读写锁。

  • 锁分段。1.7之前,ConcurrentHashMap使用分段所。1.7之后ConcurrentHashMap使用table的head作为同步对象。

  • 避免锁热点。例如热点账户拆分子账户。

  • 无锁。CAS原子操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值