非阻塞算法用硬件的原生形态代替JVM的锁定代码路径,从而在更细的粒度层次上(独立的内存位置)进行同步,失败的线程也可以立即重试,而不会被挂起后重新调度。更细的粒度降低了争用的机会,不用重新调度就能重试的能力也降低了争用的成本。即使有少量失败的 CAS 操作,这种方法仍然会比由于锁争用造成的重新调度快得多。
有些非阻塞算法步骤的执行是要冒险的,因为知道如果CAS不成功可能不得不重做。非阻塞算法通常叫作乐观算法,因为它们继续操作的假设是不会有干扰。如果发现干扰,就会回退并重试。
在轻度到中度的争用情况下,非阻塞算法的性能会超越阻塞算法,因为CAS的多数时间都在第一次尝试时就成功,而发生争用时的开销也不涉及线程挂起和上下文切换,只多了几个循环迭代。没有争用的CAS要比没有争用的锁便宜得多(这句话肯定是真的,因为没有争用的锁涉及CAS加上额外的处理),而争用的CAS 比争用的锁获取涉及更短的延迟。在高度争用的情况下(即有多个线程不断争用一个内存位置的时候),基于锁的算法开始提供比非阻塞算法更好的吞吐率,因为当线程阻塞时,它就会停止争用,耐心地等候轮到自己,从而避免了进一步争用。但是,这么高的争用程度并不常见,因为多数时候,线程会把线程本地的计算与争用共享数据的操作分开,从而给其他线程使用共享数据的机会。(这么高的争用程度也表明需要重新检查算法,朝着更少共享数据的方向努力。)
阻塞算法和非阻塞算法对比
原创文章标签 阻塞算法和非阻塞算法对比 文章分类 数据结构与算法 人工智能
©著作权归作者所有:来自51CTO博客作者古道卿的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
阻塞和非阻塞IO
1.阻塞和非阻塞IO 1.1 简介 阻塞IO:当应用程序申请不到内核资源时,程序进入阻塞状态直至被唤醒 代码如下图所示 非阻塞IO
#include linux 等待队列 -
阻塞和非阻塞通信
同步、异步、阻塞和非阻塞是几种基本的sockets调用方式,也是在进行
非阻塞 文件描述符 数据 聊天室 多路