本文是一系列并发编程文章的学习笔记之一,意在厘清非阻塞、无锁、无等待着三个概念。
非阻塞
阻塞是操作系统层面的概念,发生阻塞的准确含义为:当前执行上下文通过调用操作系统的接口,使自己进入等待某一事件发生的状态。在这种等待中,该上下文将被从操作系统的调度队列中移除,而将不获得任何CPU执行时间。直到等待的事件发生,才被从新纳入调度。
因此,所谓非阻塞算法是指,算法中不存在任何位置将使当前上下文进入阻塞的状态。
无锁
无锁是一种比非阻塞更强的条件,也就是说所有无锁算法都是非阻塞的,但是非阻塞算法不一定是无锁的。
无锁算法指的是,在不用互斥锁的情况下解决并发执行环境的Race Condition。无锁算法与非阻塞算法的关键区分在于:无锁算法在执行过程中,某一上下文因为任何原因无法继续执行需要暂时搁置时,其他上下文能否继续执行,如果可以则该算法是无锁算法,否则该算法就不是无锁算法,顶多只有可能是非阻塞算法。
例如,自旋锁(Spin-lock)算法:某一执行上下文在获得锁之后,其他上下文需要循环忙等,
就是一种非阻塞算法但不是无锁算法。因为在自旋锁算法中,所有上下文在并发冲突时都是忙等,没有通过调用操作系统的接口把自己从操作系统的调度队列中移除。但它不是无锁算法,因为当获得锁的上下文无法继续执行时,其他所有上下文都必须忙等而无法继续执行。
无等待
无等待是一种比无锁更强的条件,无等待算法要求在无锁算法的定义基础上,增加一个条件:所有上下文的执行都必须在有限的步骤内可以完成,而不依赖于其他上下文的状态。
分享到:
相关推荐
多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf 多线程并发访问无锁队列的算法研究.pdf
一个无锁算法的库实现, 采用cas实现.
CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值, 而其 它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
简介:Java5.0第一次让使用Java语言开发非阻塞算法成为可能,java.util.concurrent包充分地利用了这个功能。非阻塞算法属于并发算法,它们
ALFHJ:一种面向众核协处理器的自适应无锁哈希连接算法.pdf
#资源达人分享计划#
多线程环境下,一般通过锁来同步访问共享资源;非阻塞算法不需要锁实现共享资源的访问.可以在本资源提供的算法基础上实现需要的算法.
基于令牌桶算法实现的SpringBoot无锁限流插件,支持方法级别、系统级别的限流,提供快速失败与CAS阻塞两种方案,开箱即用!
内部资料。关于分布式,并行计算,无锁编程相关的最新研究方向。
提出一种适用于并行安全网关流水线模型中共享数据缓冲区操作的无锁队列算法....证明了算法具有线性化和非阻塞特性.通过模拟试验,验证了算法在理想环境和各种实际应用环境中都具有较好的性能指标.
提出一种构建用于动态无锁数据结构的内存池的方法来减少动态内存使用和与之相伴的动态内存管理开销。该方法通过平衡线程的动态内存消耗来减小内存开销, 利用本方法构建的内存池基于线程私有的支持节点窃取的无锁循环...
基于无锁方法的二叉搜索树算法之计算机研究.docx
Google是开发出既有效率又能容错的并行计算就是使用这个算法
俄罗斯方块核心算法俄罗斯方块核心算法俄罗斯方块核心算法俄罗斯方块核心算法俄罗斯方块核心算法俄罗斯方块核心算法
Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms
连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar
本文介绍了在Java理论与实践中,几种比较简单的非阻塞算法的工作方式。在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情。Java语言中主要的同步手段就是...
1、实验目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解 2、实验内容 (1)用C语言来实现对N个进程采用动态优先权优先算法的进程调度 (2)每个用来标示进程的PCB用结构来描述,包括字段如下: ...
基于多核处理器的有锁编程与非阻塞算法研究.pdf
gotomic, Go的非阻塞数据结构 gotomicGo的...算法List 类型是用实现的:Timothy的非阻塞链表的语用实施。 。使用拆分有序列表实现 Hash 类型: 使用Ori和 Nir 锁免费扩展散列表,并将列表类型用作后台。使用OSTM并发编