26.活锁、饥饿锁

两个线程,相互改变了对方结束条件,导致两个线程不能结束。执行时间也都是一样,导致两个线程永远不会结束。

java 复制代码
@Slf4j
public class LiveLockDemo {
    static volatile int count = 10;
    public static void main(String[] args) {

        new Thread(() -> {
            while (count > 0) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count --;
                log.info("count={}", count);
            }
        }, "t1").start();

        new Thread(() -> {
            while (count < 20) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count ++;
                log.info("count={}", count);
            }
        }, "t2").start();
    }
}

解决办法:将执行时间设置成不一样即可。

扩充:饥饿锁表示某一个线程长时间获取不到cpu的资源,得不到执行。

相关推荐
Mr1ght6 分钟前
为什么 InheritableThreadLocal 在 Spring 线程池中“偶尔”能传递变量?——一次线程池上下文传播的误解
java·spring
毕设源码-赖学姐15 分钟前
【开题答辩全过程】以 基于Java的保定理工科研信息管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
JIngJaneIL35 分钟前
基于Java+ vue智慧医药系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
2501_9167665439 分钟前
【Spring框架】SpringJDBC
java·后端·spring
谷哥的小弟1 小时前
Spring Framework源码解析——ApplicationContextInitializer
java·spring·源码
布谷歌1 小时前
在java中实现c#的int.TryParse方法
java·开发语言·python·c#
while(1){yan}1 小时前
网络基础知识
java·网络·青少年编程·面试·电脑常识
Ulana1 小时前
计算机基础10大高频考题解析
java·人工智能·算法
黄俊懿1 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——@GlobalTransactional注解与@globalLock生效的原理
java·spring cloud·微服务·云原生·架构·系统架构·架构师
wheelmouse77881 小时前
一个优雅、通用、零侵入的 CSV 导出工具类(Java 实战)
java·开发语言