深入理解并发线程的公平性与线程饥饿

跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理。

作者简介:笔名seaboat,擅长工程算法、人工智能算法、自然语言处理、架构、分布式、高并发、大数据和搜索引擎等方面的技术,大多数编程语言都会使用,但更擅长Java、Python和C++。平时喜欢看书、写作和运动,擅长篮球、跑步、游泳、健身和羽毛球等运动项目。崇尚开源,崇尚技术自由,更崇尚思想自由。出版书籍:《Tomcat内核设计剖析》、《图解数据结构与算法》、《图解Java并发原理》、《人工智能原理科普》。

线程饥饿

线程饥饿是一种因为长期无法获取到共享资源或CPU而导致线程无法被执行的现象,在并发过程中更多的是指线程分配不到CPU而无法执行,其它更贪婪的线程把CPU都占用光了。比如Java中我们最常见的使用synchronized对资源加锁时,如果不断有大量线程去竞争获取锁,那么就有可能会产生线程饥饿。用形象一点的比喻就是源源不断的球通过仅有的两个通道,由于通道有限所以会导致入口拥挤,其中有一个绿色的球长期无法进入导通的就是所谓的饥饿现象。

深入理解并发线程的公平性与线程饥饿_第1张图片

synchronized饥饿

有很多种情况都可能会造成饥饿现象,我们先看synchronized的例子。我们知道synchronized其实就是加锁,那么多个线程到达该节点后就会去竞争锁,而synchronized没有要求公平性,于是便可能导致有些线程一直得不到锁无法执行。为了让大家更加形象化看到效果,这个例子我们使用了图形进度条,分别使用十个进度条代表线程被执行的次数。每个线程里面都会不断循环去获取锁,然后将自己的进度

你可能感兴趣的:(java,并发,线程饥饿,公平,synchronized)