精华内容
下载资源
问答
  • 活锁

    2013-05-02 09:21:00
    活锁 活锁(英文 livelock),指事物1可以使用资源,但它让其他事物先使用资源;事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。 所谓饥饿,是指如果事务T1封锁了数据R,...

    活锁

     
    活锁(英文 livelock),指事物1可以使用资源,但它让其他事物先使用资源;事物2可以使用资源,但它也让其他事物先使用资源,于是两者一直谦让,都无法使用资源。
    所谓饥饿,是指如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......T2可能永远等待,这就是饥饿。
    活锁有一定几率解开。而死锁(deadlock)是无法解开的。
    避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。

    转载于:https://www.cnblogs.com/lihaozy/archive/2013/05/02/3054038.html

    展开全文
  • java 活锁_Java线程活锁

    2021-02-27 13:48:00
    活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待。活锁有可能自行解开,死锁则不能。package com.what21.thread07;public class LiveLockThreadTest {/*** @...

    活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待。

    活锁有可能自行解开,死锁则不能。

    package com.what21.thread07;

    public class LiveLockThreadTest {

    /**

    * @param args

    */

    public static void main(String[] args) {

    Person zhangsan = new Person("张三");

    Person lisi = new Person("李四");

    // 张三的朋友是李四

    zhangsan.friend = lisi;

    // 李四的朋友是张三

    lisi.friend = zhangsan;

    // 张三先鞠躬

    zhangsan.bow();

    lisi.start();

    try {

    Thread.sleep(500);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    zhangsan.start();

    }

    }

    package com.what21.thread07;

    public class Person extends Thread {

    // 朋友

    public Person friend;

    // 名字

    private String name;

    // 鞠躬

    private boolean bow;

    /**

    * @param name

    */

    public Person(String name) {

    this.name = name;

    }

    /**

    * 鞠躬

    */

    public void bow() {

    this.bow = true;

    }

    /**

    * 完成鞠躬

    */

    public void up() {

    this.bow = false;

    }

    @Override

    public void run() {

    while (true) {

    // 如果朋友在鞠躬

    if (friend.bow) {

    // 自己也得鞠躬

    this.bow();

    try {

    System.out.println(this.name + " 正在鞠躬 ... ");

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    // 一分钟后鞠躬完成

    this.up();

    } else {

    try {

    Thread.sleep(200);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    if (friend.bow) {

    this.bow();

    try {

    System.out.println(this.name + " 正在鞠躬 ... ");

    Thread.sleep(1000);

    } catch (InterruptedException e) {

    e.printStackTrace();

    }

    this.up();

    } else {

    break;

    }

    }

    }

    }

    }

    展开全文
  • 活锁 Livelock

    千次阅读 2017-05-29 17:48:22
    活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。 活锁可以认为是一种特殊的饥饿。 下面这个例子在有的文章里面认为是...
    【概念】
    活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
    活锁可以认为是一种特殊的饥饿。 下面这个例子在有的文章里面认为是活锁。实际上这只是一种饥饿。因为没有体现出“活”的特点。 假设事务T2再不断的重复尝试获取锁R,那么这个就是活锁。
    如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁后,系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后,系统又批准了T4的请求......T2可能永远等待。
    活锁应该是一系列进程在轮询地等待某个不可能为真的条件为真。活锁的时候进程是不会blocked,这会导致耗尽CPU资源。
    【例子】
    单一实体的活锁
    例如线程从队列中拿出一个任务来执行,如果任务执行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。
    协同导致的活锁
    生活中的典型例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。
    通信中也有类似的例子,多个用户共享信道(最简单的例子是大家都用对讲机),同一时刻只能有一方发送信息。发送信号的用户会进行冲突检测, 如果发生冲突,就选择避让,然后再发送。 假设避让算法不合理,就导致每次发送,都冲突,避让后再发送,还是冲突。
    计算机中的例子:两个线程发生了某些条件的碰撞后重新执行,那么如果再次尝试后依然发生了碰撞,长此下去就有可能发生活锁。
    【解决】
    解决协同活锁的一种方案是调整重试机制。
    比如引入一些随机性。例如如果检测到冲突,那么就暂停随机的一定时间进行重试。这回大大减少碰撞的可能性。 典型的例子是以太网的CSMA/CD检测机制。
    另外为了避免可能的死锁,适当加入一定的重试次数也是有效的解决办法。尽管这在业务上会引起一些复杂的逻辑处理。
    展开全文
  • 线程活锁

    2019-10-08 08:06:15
    活锁:有时线程虽然没有发生阻塞,但仍然会存在执行不下去的情况。 可以类比现实世界里的例子,路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,...

    Reference: https://time.geekbang.org/column/article/85702

     

    活锁:有时线程虽然没有发生阻塞,但仍然会存在执行不下去的情况。

    可以类比现实世界里的例子,路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。这种情况,基本上谦让几次就解决了,因为人会交流啊。可是如果这种情况发生在编程世界了,就有可能会一直没完没了地“谦让”下去,成为没有发生阻塞但依然执行不下去的“活锁”。

     

    解决“活锁”的方案很简单,谦让时,尝试等待一个随机的时间就可以了。例如上面的那个例子,路人甲走左手边发现前面有人,并不是立刻换到右手边,而是等待一个随机的时间后,再换到右手边;同样,路人乙也不是立刻切换路线,也是等待一个随机的时间再切换。由于路人甲和路人乙等待的时间是随机的,所以同时相撞后再次相撞的概率就很低了。“等待一个随机时间”的方案虽然很简单,却非常有效,Raft这样知名的分布式一致性算法中也用到了它。

    转载于:https://www.cnblogs.com/agilestyle/p/11424728.html

    展开全文
  • Java线程活锁

    2021-01-27 13:44:18
    活锁是一种递归情况,其中两个或更多线程将继续重复特定的代码逻辑。预期的逻辑通常是给其他线程机会以支持“此”线程。 当两个人在狭窄的走廊里相遇时,发生了现实生活中的活锁例子,每个人都试图通过移动到一边让...
  • 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。产生死锁的必要条件:互斥条件:所谓互斥就是进程在某一...活锁:任务或者执...
  • 活锁和饥饿

    2021-03-14 17:24:37
    活锁 活锁本质上不是锁,是互相干扰导致线程无法跳出循环,比如: public class TestLiveLock { static volatile int count = 10; static final Object lock = new Object(); public static void main(String[] ...
  • 活锁在于线程是“活”的,不阻塞,但却一直忙碌不能完成线程生命周期。有几个疑惑想请教下大家,活锁的发生是否一定需要上锁(synchronized或lock),活锁的demo一般基于不断重...
  • 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。产生死锁的必要条件:互斥条件:所谓互斥就是进程在某一...活锁:任务或者执...
  • Java多线程 活锁

    2020-09-13 11:21:36
    文章目录活性故障活锁 (Livelock)工程中的活锁实例: 消息队列 活性故障 死锁是最常见的活跃性问题, 除了死锁外, 还有类似的问题导致程序无法顺利的执行, 统称为活跃性问题. 例如 活锁 (Livelock) 饥饿 活锁 ...
  • 死锁和活锁

    千次阅读 2019-06-12 11:19:29
    活锁: 简单描述: 事务T1封锁了数据R 事务T2又请求封锁R,于是T2等待。 T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。 T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了...
  • 1、概览当多线程帮助我们提高应用性能的同时,它同时也带来一些问题,本文我们将借助几个小例子看下两个问题,死锁和活锁。2、死锁2.1、什么是死锁死锁发生在当两个或多个线程一直在等待另一个线程持有的锁或资源的...
  • 多线程饥饿与Java多线程活锁线程饥饿线程饥饿是指线程一直无法获得所需要的资源导致任务一直无法执行的一种活性故障。线程饥饿的一个典型例子就是在高争用环境中使用非公平模式的读写锁.读写锁默认情况下采用非公平...
  • 本节我们来介绍一下死锁、活锁和饥饿这三个概念。死锁死锁是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或...
  • 并行计算 死锁 活锁

    2020-08-31 20:37:31
    活锁与死锁相似,除了与活锁相关的进程总是会随着一个其他的进程而改变,但是进程不会运行。活锁是一种资源饥饿的特殊情况。广义的定义只说明了一个特定的进程没有运行。 活锁在一个现实世界中的一个例子:当两个人...
  • 本文介绍了Java中常见死锁与活锁的实例详解,分享给大家,具体如下:顺序死锁:过度加锁,导致由于执行顺序的原因,互相持有对方正在等待的锁资源死锁:多个线程在相同的资源上发生等待由于调用顺序而产生的死锁...
  • 数据库原理 活锁死锁

    2020-03-14 10:29:02
    活锁:某个事务被其它后来的事务抢占了,产生一直没有运行的现象 死锁:两个事务各自需要对方解决自己要操作的数据对象上的锁的权限,永久等待对方释放锁 2、如何避免活锁?死锁? 避免活锁: 采用先来先服务...
  • 但在出现竞争的情况下,其收敛速度很慢,甚至可能出现活锁的情况,例如当有等于或多于审批委员会数量的“提案委员”在同时发送提案请求后,很难有一个“提案委员”收到半数以上的回复而不断地执行第一阶段的协议。...
  • 活锁 任务没有被阻塞,由于某些条件没有满足,导致一直重复尝试—失败—尝试—失败的过程。 处于活锁的实体是在不断的改变状态,活锁有可能自行解开。 死锁是大家都拿不到资源都占用着对方的资源,而活锁是拿到...
  • 死锁、活锁、饥饿

    千次阅读 多人点赞 2019-02-25 09:40:31
    死锁、活锁、饥饿 文章目录死锁、活锁、饥饿一 什么是死锁二 什么是活锁三 什么是饥饿 一 什么是死锁 死锁:是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用...
  • 本节介绍死锁、饿死和活锁4.1 死锁(Deadlock)死锁描述了两个或多个线程因相互等待而永远阻塞的问题。下面举例说明。Alphonse 和 Gaston 是好朋友,都是礼仪的信仰者。礼仪中一个严格的规则是,当你向你的朋友鞠躬时...
  • 死锁,饥饿和活锁

    2020-12-28 17:35:17
    死锁,饥饿和活锁用来描述线程的活跃性问题 死锁:多个线程彼此占用其他线程的资源,各个线程都不愿意放弃资源,那么这个状态将永远的持续下去,这种状态就是死锁。 饥饿:指一个或多个线程因为种种原因无法获得...
  • 主要介绍了Java中常见死锁与活锁的实例详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 死锁、活锁及饥饿

    2019-09-25 22:13:53
    死锁、活锁、饥饿死锁定义产生死锁的必要条件死锁解决方法活锁定义活锁解决方法活锁和死锁的区别饥饿定义Java中导致饥饿的原因 死锁 定义 是指两个或两个以上的进程(或线程)在执行过程中,因争夺资源而造成的一...
  • Java线程的死锁和活锁

    2020-06-23 23:35:58
    文章目录1、概览2、死锁2.1、什么是死锁2.2 死锁举例2.3 避免死锁3、活锁3.1 什么是活锁3.2 活锁举例3.3 避免活锁 1、概览 当多线程帮助我们提高应用性能的同时,它同时也带来一些问题,本文我们将借助几个小例子看...
  • 活锁、死锁和饥饿

    热门讨论 2017-10-23 10:17:02
    在我们利用封锁技术时,可以避免并发操作引起的各种错误,但是可能产生三个问题:活锁、死锁和饥饿。以下是个人的简单理解。 活锁  活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试...
  • 死锁、饥饿和活锁

    2020-02-15 15:09:59
    死锁、饥饿和活锁 原文地址 Java并发编程系列之十二:死锁、饥饿和活锁 正文 死锁发生在一个线程需要获取多个资源的时候,这时由于两个线程互相等待对方的资源而被阻塞,死锁是最常见的活跃性问题。 这里先分析死锁...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 925
精华内容 370
关键字:

活锁