Java线程活锁的实现与死锁等的区别

 更新时间:2024年04月01日 11:45:25   作者:小张frog  
活锁是一种递归情况,其中两个或更多线程将继续重复特定的代码逻辑,本文主要介绍了Java线程活锁的实现与死锁等的区别,具有一定的参考价值,感兴趣的可以了解一下

1、什么是活锁

活锁是指,线程没有发生阻塞,但依然执行不下去的情况。

2、活锁的例子

如果两个线程互相改变对方的结束条件,就可能导致双方谁也无法结束。

比如这个程序:

public class TestLiveLock {
    static volatile int count = 10;
    static final Object lock = new Object();
    public static void main(String[] args) {
        new Thread(() -> {
            // 期望减到 0 退出循环
            while (count > 0) {
                sleep(0.2);
                count--;
                log.debug("count: {}", count);
            }
        }, "t1").start();
        
        new Thread(() -> {
            // 期望超过 20 退出循环
            while (count < 20) {
                sleep(0.2);
                count++;
                log.debug("count: {}", count);
            }
        }, "t2").start();
    }
}

相当于一个抽水一个注水,水池永远不会空或者满

用生活举例看Java多线程活跃性问题【死锁、饥饿、活锁】

死锁:吃饭问题,5个人每人只有一双筷子,只有让另外一个人分享他自己的筷子给自己,自己才能吃到饭。若存在这样的情况,若每个人都不把自己的筷子借给别人用餐,每个人都抓着自己手中的筷子不放,那么每个人都吃不上饭饿死了。也就是说A线程拥有B线程所需的资源,B线程也有A线程所需资源,但两者都不把资源分享出来,最后需求达不到,最后饿死。

饥饿问题:学校饭堂排队打饭,但有些人无秩序插队,那么插队的人拥有了更高的优先级,更可能打到饭吃,也可能他买上了饭也不离开,导致后面的人无法打饭。最后那些守规矩的人(优先级很低的人),就被饿死了。

引起饥饿问题的一些因素:

  • 高优先级吞噬所有低优先级的CPU时间片
  • 线程被永久堵塞在一个等待进入同步块的状态
  • 等待的线程永远不被唤醒来

如果尽量避免饥饿问题:

设置合理的优先级,使用锁来代替synchronized

活锁:到达终点有两条路(记作1号路和2号路),有一对冤家A和B两人同时走了1号路,在途中相遇,他们俩看见了对方,于是都转身离开,A走了2号路,B也走了2号路,在行走的过程中,两人又再见碰面,于是又转身离开。后来A、B两人又同时走了1号路又再次碰面,就这样反反复复...这就是活锁问题

到此这篇关于Java线程活锁的实现与死锁等的区别的文章就介绍到这了,更多相关Java线程活锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java设计模式之模板模式(Template模式)介绍

    Java设计模式之模板模式(Template模式)介绍

    这篇文章主要介绍了Java设计模式之模板模式(Template模式)介绍,定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中,需要的朋友可以参考下
    2015-03-03
  • java整合onlyoffice的各种踩坑记录

    java整合onlyoffice的各种踩坑记录

    这篇文章主要给大家介绍了关于java整合onlyoffice的各种踩坑,OnlyOffice是一种强大的在线协作软件,专为企业和个人设计,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • RabbitMQ消息的延迟队列详解

    RabbitMQ消息的延迟队列详解

    这篇文章主要介绍了RabbitMQ消息的延迟队列,延迟队列也就是死信交换机,有些队列的消息成为死信后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列,感兴趣的同学可以参考下文
    2024-02-02
  • Java使用wait/notify实现线程间通信上篇

    Java使用wait/notify实现线程间通信上篇

    wait()和notify()是直接隶属于Object类,也就是说所有对象都拥有这一对方法,下面这篇文章主要给大家介绍了关于使用wait/notify实现线程间通信的相关资料,需要的朋友可以参考下
    2022-12-12
  • Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决

    Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决

    这篇文章主要介绍了Java SpringBoot整合shiro-spring-boot-starterqi项目报错解决,文章围绕主题展开详细的内容介绍,具有一定的参考一下
    2022-08-08
  • Zookeeper原理及在Dubbo中的使用示例详解

    Zookeeper原理及在Dubbo中的使用示例详解

    这篇文章主要为大家介绍了Zookeeper原理及在Dubbo中的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Open-Feign整合hystrix降级熔断实战记录

    Open-Feign整合hystrix降级熔断实战记录

    这篇文章主要介绍了Open-Feign整合hystrix降级熔断实战记录,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java集合源码ArrayList的可视化操作过程示例详解

    Java集合源码ArrayList的可视化操作过程示例详解

    这篇文章主要介绍了Java集合源码ArrayList的可视化操作过程示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-06-06
  • Java中@JSONField注解的使用详解

    Java中@JSONField注解的使用详解

    这篇文章主要介绍了Java中@JSONField注解的使用,@JSONField是阿里巴巴开源的JSON处理库FastJSON提供的一个注解,用于在Java对象和JSON数据之间进行序列化和反序列化时,对字段的行为进行更精细的控制,需要的朋友可以参考下
    2025-05-05
  • Java super关键字的使用方法详解

    Java super关键字的使用方法详解

    这篇文章主要介绍了Java super关键字的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家对super关键字彻底掌握,需要的朋友可以参考下
    2017-10-10

最新评论