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自加和自减运算过程

    java自加和自减运算过程

    这篇文章主要介绍了java自加和自减运算过程,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • 浅谈Java解释器模式

    浅谈Java解释器模式

    这篇文章主要介绍了Java基于解释器模式实现定义一种简单的语言功能,简单描述了解释器模式的概念、功能及Java使用解释器模式定义一种简单语言的相关实现与使用技巧,需要的朋友可以参考下
    2021-10-10
  • 导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法

    导入项目出现Java多个工程相互引用异常A cycle was detected in the build path o

    今天小编就为大家分享一篇关于导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中JUC包(java.util.concurrent)下的常用子类

    Java中JUC包(java.util.concurrent)下的常用子类

    相信大家已经对并发机制中出现的很多的常见知识点进行了总结,下面这篇文章主要给大家介绍了关于Java中JUC包(java.util.concurrent)下的常用子类的相关资料,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Java 实现对称加密算法

    Java 实现对称加密算法

    这篇文章主要介绍了Java 实现对称加密算法的相关资料,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • spring boot 加载web容器tomcat流程源码分析

    spring boot 加载web容器tomcat流程源码分析

    本文章主要描述spring boot加载web容器 tomcat的部分,为了避免文章知识点过于分散,其他相关的如bean的加载,tomcat内部流程等不做深入讨论,具体内容详情跟随小编一起看看吧
    2021-06-06
  • Spring Boot+Nginx实现大文件下载功能

    Spring Boot+Nginx实现大文件下载功能

    相信很多小伙伴,在日常开放中都会遇到大文件下载的情况,大文件下载方式也有很多,比如非常流行的分片下载、断点下载;当然也可以结合Nginx来实现大文件下载,在中小项目非常适合使用,这篇文章主要介绍了Spring Boot结合Nginx实现大文件下载,需要的朋友可以参考下
    2024-05-05
  • java8的stream如何取max

    java8的stream如何取max

    这篇文章主要介绍了java8的stream如何取max问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java实现简单登录界面的实战过程

    java实现简单登录界面的实战过程

    学习JAVA的过程当中,登陆界面是多数人第一个实现的小程序,下面这篇文章主要给大家介绍了关于利用java实现简单登录界面的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 使用MultipartFile实现文件上传功能

    使用MultipartFile实现文件上传功能

    这篇文章主要介绍了使用MultipartFile实现文件上传功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论