高并发编程-05-活跃性问题

死锁,饥饿,活锁

1,死锁

多个线程,各自占对方的资源,都不愿意释放,从而造成死锁

工具:使用jconsole可以检测程序运行的死锁线程

2,饥饿

多个线程访问同一个同步资源,有些线程总是没有机会得到互斥锁,这种就叫做饥饿。

出现饥饿的三种情况

a,高优先级的线程吞噬了低优先级的线程的CPU时间片

理论上来说,线程优先级高的线程会比线程优先级低的线程获得更多的执行机会,但是java的线程优先级绝对出现这样的效果。

经过测试,优先级高的出现频率会比优先级低的高很多

不同的操作系统对线程的优先级支持是不同的,规定是在1-10之间,java通过3个常量来屏蔽这种操作系统的底层差异化。

b,线程被永久阻塞在等待进入同步代码块的状态

c,等待的线程永远不被唤醒

如何避免饥饿问题

a,设置合理的优先级

b,使用公平锁来代替synchronized这种互斥锁

3,活锁

举个例子,两个人在走廊上碰见,大家都互相很有礼貌,互相礼让,A从左到右,B也从从左转向右,发现又挡住了地方,继续转换方向,但又碰到了,反反复复,一直没有机会运行下去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • layout: posttitle: 《Java并发编程的艺术》笔记categories: Javaexcerpt...
    xiaogmail阅读 5,899评论 1 19
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,757评论 0 11
  • 卷首语 欢迎来到 objc.io 的第二期! 首先,我们想对各位读者说声谢谢!第一期推出后,大家的反馈如同潮水一般...
    评评分分阅读 449评论 0 7
  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 924评论 0 1
  • 苏大学习(四) 《互联网+背景下教学资源应用的多样化》叶鹏松 1.二维码,草料二维码(生成器),用ie浏览器打开,...
    精神灿烂阅读 715评论 0 0