阻塞,无锁,无等待的区别
阻塞,blocking
一个方法被称为阻塞的,即这个方法在其演进过程中不能正常运行直到其他(占有锁的)线程释放。
也就是普通的synchronized方法,同一时间内只有一个线程占有了锁,其他线程只能等待。但是这个占有锁的线程并不一定真的在工作(可能被挂起了)。
无锁,lock-free
An algorithm is lock-free if, when the program threads are run for a sufficiently long time, at least one of the threads makes progress (for some sensible definition of progress).
如果所有线程运行了足够长时间后,至少有一个线程能获得进展,那么这个算法是无锁的。
用人话讲就是:系统中无论何时,始终有一个线程在工作。
无等待,wait-free
An algorithm is wait-free if every operation has a bound on the number of steps the algorithm will take before the operation completes.
假如一个方法是无等待的,那么它保证了每一次调用都可以在有限的步骤内结束。
用人话讲就是,系统中的所有线程,都会在有限时间内结束,无论如何也不可能出现饿死(starving)的情况。
再通俗一点的说:
阻塞算法可能会出现整个系统都挂起的情况(占有锁的线程被中断,那么所有试图争用这个锁的线程会被挂起),系统中的所有线程全部饿死
无锁算法可以保证系统中至少有一个线程处于工作状态,但是还是可能有线程永远抢不到资源而被饿死
无等待算法保证系统中的所有线程都能处于工作状态,没有线程会被饿死,只要时间够,所有线程都能结束。
The difference between wait-free and lock-free is that wait-free operation by each process is guaranteed to succeed in a finite number of steps, regardless of the other processors.
补充:
集居数无关无等待,Wait-Free-Population-Oblivious
一个无等待的方法,如果其性能和活动线程数目无关,那么被称为集居数无关无等待的。
这个是更强的wait-free算法,因为一般的wait-free中的每个线程虽然能在有限步数内结束,但是实际上它的开销往往与并发的线程数有关。可能工作线程越多,平均到每个线程头上的耗时就越长。
而集居数无关无等待算法则可以理解为:线程的平均开销是一个与并发数n无关的函数。
也就是说,我们可以通过无限制的增加线程数来提高总的工作效率(而且是线性扩展)。
参考资料
https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用