活锁(livelock)

活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;
活锁有可能自行解开,死锁则不能。
活锁可以认为是一种特殊的饥饿。
下面这个例子在有的文章里面认为是活锁。实际上这只是一种饥饿。因为没有体现出“活”的特点。 假设事务T2再不断的重复尝试获取锁R,那么这个就是活锁。 如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......T2可能永远等待。 活锁应该是一系列进程在轮询地等待某个不可能为真的条件为真。活锁的时候进程是不会blocked,这会导致耗尽CPU资源。 活锁的例子

单一实体的活锁 例如线程从队列中拿出一个任务来执行,如果任务执行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。 协同导致的活锁 生活中的典型例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。 通信中也有类似的例子,多个用户共享信道(最简单的例子是大家都用对讲机),同一时刻只能有一方发送信息。发送信号的用户会进行冲突检测, 如果发生冲突,就选择避让,然后再发送。 假设避让算法不合理,就导致每次发送,都冲突,避让后再发送,还是冲突。 计算机中的例子:两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞,长此下去就有可能发生活锁。 活锁的解决方法

解决协同活锁的一种方案是调整重试机制。 比如引入一些随机性。例如如果检测到冲突,那么就暂停随机的一定时间进行重试。这回大大减少碰撞的可能性。 典型的例子是以太网的CSMA/CD检测机制。 另外为了避免可能的死锁,适当加入一定的重试次数也是有效的解决办法。尽管这在业务上会引起一些复杂的逻辑处理。 比如约定重试机制避免再次冲突。 例如自动驾驶的防碰撞系统(假想的例子),可以根据序列号约定检测到相撞风险时,序列号小的飞机朝上飞, 序列号大的飞机朝下飞。

http://baike.baidu.com/view/281236.htm

时间: 2024-12-21 04:27:38

活锁(livelock)的相关文章

分布式系统理论进阶 - Paxos

引言 <分布式系统理论基础 - 一致性.2PC和3PC>一文介绍了一致性.达成一致性需要面临的各种问题以及2PC.3PC模型,Paxos协议在节点宕机恢复.消息无序或丢失.网络分化的场景下能保证决议的一致性,是被讨论最广泛的一致性协议. Paxos协议同时又以其“艰深晦涩”著称,下面结合 Paxos Made Simple.The Part-Time Parliament 两篇论文,尝试通过Paxos推演.学习和了解Paxos协议. Basic Paxos 何为一致性问题?简单而言,一致性问题

实战java高并发程序设计 1

重要概念 同步(synchronous)和异步(asynchronous) 同步等待方法返回 异步瞬间返回,继续下一次调用 并发(Concurrency)和并行(Parallelism) 并发与并行外界表现一致 单核心cpu无法并行,但可以处理并行事务 临界区 公共资源或者共享数据 多线程访问时,可能造成临界区数据破坏 阻塞(Blocking)和非阻塞(Non-Blocking) 非阻塞允许多个线程同时进入临界区 死锁(Deadlock).饥饿(Starvation)和活锁(Livelock)

Java-Review-Note——4.多线程

Java-Review-Note--4.多线程 PS:干货满满,看得够呛,本来是分开三篇的,后来想想还是整理成一篇了,只能说,纸上得来终觉浅,绝知此事要躬行, 开了眼界,但很多东西还需要实践-Σ(⊙▽⊙"a 附上静心大悲咒帮助阅读~ 程序,进程,线程及多线程的理解 程序:为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码) 进程:运行中的程序,系统调度与资源分配的一个独立单位,操作系统会为每个进程分配 一段内存空间:程序的依次动态执行,经历代码的加载,执行,执行完毕的完整过程. 线程:

理解Clojure STM 软件事务性内存

翻译说明: 英文原文来自:http://java.ociweb.com/mark/stm/article.html 原文包含了一些非STM的知识,也包括STM底层实现的内容,这里只是翻译了STM抽象层的内容,自认为这部分比较重要. 翻译是基于自己能够理解的方式翻译的,并非逐句翻译,目的是理解STM,理解如何调优STM,有逐句翻译强迫症的同学请不要喷我! 本人是在学习<Clojure编程乐趣>的"压力之下的 Ref"章节,遇到无法理解minHistory和maxHistory

第一课 前言

1.同步(synchronous)和异步(asynchronous) 同步和异步是对方法的调用而言的 同步:提交请求->等待服务器处理->处理完毕返回 : 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这时候浏览器仍然可以作其他事情)->处理完毕 (异步调用方法后返回很快,这个时候后台会启动一个线程,而接下来的任务会由这个线程去做) 2.并发和并行 并行:是指两个线程(或进程)在同一时刻发生 (多个CPU的情况下) 并发:指两个或多个事件在同一时间间隔内

一、多线程基础

1.同步和异步 比如执行两个方法,同步是指第1个方法执行完返回结果再继续执行第2个方法:而异步是指方法执行不等其结果,另一个方法相继执行,所以结果返回有延迟(ajax调用) 同步特点:保证方法有序的执行,缺点响应慢 异步特点:响应速度快,但不能保证结果有序的执行,如方法1执行时,结果还未返回,方法2已经执行,如果此是需要用方法1的结果作为参数去执行方法2,那么可能程序会报错2.并发(单个CPU)和并行(多个CPU) 但因CPU执行速度很快,看似都在同时进行,所以一般不作区分3.临界区 多线程共同

java并发的基本概念和级别

并发的概念: 并发(Concurrency)和并行(Parallelism) 并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的.而并行是真正意义上的“同时执行”.严格意义上来说,并行的多个任务是真实的同时执行,而对于并发来说,这个过程只是交替的,一会儿运行任务A一会儿执行任务B,系统会不停地在两者间切换.但对于外部观察者来说,即使多个任务之间是串行并发的,也会造成多任务间是并行执行的错觉.真实的并行也只可能出现在拥有多个CPU的系统中(比如多核CPU). 临界区 临界区用来表示一种公共

多线程编程--心得

概念: (一).临界区 临界区用来表示一种公共资源,或者说是一种共享数据.它可以被多个线程使用,但是每一次只能有一个线程能使用它.一旦临界区被占有,那么其他的线程只能等待.  (二).死锁(Deadlock),活锁(Livelock),饥饿(Starvation)   死锁是表示当多个线程互相持有对方所需要的锁,并一直等待的场景.假如有2个线程 A,B.当线程A在执行的过程中持有锁A,并且向下执行程序时需要锁B,那么线程A会等待锁B的释放.这个时候,恰巧线程B持有锁B,并释放的条件的需要持有锁A

Java多线程(2)——线程安全

一. 竞态 状态变量(state variable):类的实例变量,静态变量. 共享变量(shared variable):可以被多个线程共同访问的变量. 竞态(race condition):是指计算的正确性依赖于相对时间顺序(Relative Timing)或者线程的交错(Interleaving). 它不一定导致计算结果的不正确,只是不排除计算结果时而正确时而错误的可能. 导致竞态的常见因素是多个线程在没有采取任何控制措施的情况下并发地更新.读取同一个共享变量.局部变量不会导致竞态. 竞态

后端技术:分布式系统理论 - 从放弃到入门

分布式系统理论 - 从放弃到入门随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群.回顾自己毕业五年来的工作内容,同样有这样的转变. 毕业头两年负责维护运行在刀片机上的业务,在机房里拔插单板的日子是我逝去的青春.设备之间通过VCS组成冷备,但即使有双机软件保护,宕机.网络丢包等问题发生时业务仍会受影响.这样的系统架构下为保证SLA,有时候需要深入 Linux系统内核或硬件层面分析机器重启的原因. 接下来负责维护承载在分布式集群上的业务,相比前面的工作,这个阶段主要