首页 > 其他分享 >线程间的礼貌竞争:避免活锁现象

线程间的礼貌竞争:避免活锁现象

时间:2024-08-10 11:23:16浏览次数:15  
标签:示例 Worker 活锁 线程 active 礼貌 public

线程间的礼貌竞争:避免活锁现象

在多线程编程中,我们经常会遇到各种同步问题,其中一种比较特殊的情况被称为“活锁”(livelock)。活锁是一种递归情况,多个线程在执行过程中不断重复某段代码逻辑,这些线程通常是为了给其他线程让路而主动放弃执行机会。这就像两个在狭窄走廊上相遇的人,他们互相礼貌地让路,但最终却因为同时向同一方向移动而无法前进。

活锁现象的现实世界类比

想象一下,两个行人在一条狭窄的走廊上相遇,他们都想让对方先过,于是都向一边移动。但当他们同时向同一方向移动时,结果就是两个人都在原地摇摆,没有一个人能够通过。这就是活锁的现实世界类比。

活锁在多线程编程中的体现

在多线程编程中,活锁可能发生在线程响应其他线程的行为时。如果一个线程的行为是对另一个线程行为的响应,而那个线程的行为又是对另一个线程的响应,那么活锁就可能发生。活锁中的线程无法进一步执行,但它们并没有被阻塞,只是太忙于响应对方而无法恢复工作。

活锁示例代码分析

让我们通过一个Java代码示例来理解活锁是如何发生的:

public class CommonResource {
    private Worker owner;
    public CommonResource(Worker d) {
        owner = d;
    }
    // 省略getter和setter方法
}

public class Worker {
    private String name;
    private boolean active;
    public Worker(String name, boolean active) {
        this.name = name;
        this.active = active;
    }
    // 省略getter方法
    public synchronized void work(CommonResource commonResource, Worker otherWorker) {
        while (active) {
            // 等待资源可用
            if (commonResource.getOwner() != this) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // 忽略中断
                }
                continue;
            }
            // 如果其他工作者也处于活跃状态,让它先工作
            if (otherWorker.isActive()) {
                System.out.println(getName() + " : 将资源交给工作者 " + otherWorker.getName());
                commonResource.setOwner(otherWorker);
                continue;
            }
            // 现在使用commonResource
            System.out.println(getName() + " : 正在使用公共资源");
            active = false;
            commonResource.setOwner(otherWorker);
        }
    }
}

public class Livelock {
    public static void main(String[] args) {
        final Worker worker1 = new Worker("Worker 1", true);
        final Worker worker2 = new Worker("Worker 2", true);
        final CommonResource s = new CommonResource(worker1);
        // 启动线程
    }
}

输出示例

Worker 1 : 将资源交给工作者 Worker 2
Worker 2 : 将资源交给工作者 Worker 1
Worker 1 : 将资源交给工作者 Worker 2
Worker 2 : 将资源交给工作者 Worker 1
...

避免活锁的策略

避免活锁没有通用的指导方针,但我们需要在改变被其他线程使用的公共对象状态时格外小心。在上面的示例中,可以通过顺序处理公共资源而不是同时在不同线程中处理来解决问题。

示例项目技术栈

  • JDK 1.8
  • Maven 3.0.4

通过这个示例,我们可以看到活锁是如何在多线程环境中发生的,以及如何通过改变设计来避免它。希望这篇文章能帮助你在实际编程中更好地理解和处理活锁问题。

标签:示例,Worker,活锁,线程,active,礼貌,public
From: https://blog.csdn.net/m0_62153576/article/details/140916720

相关文章

  • 【JavaEE初阶】线程安全的集合类
    ......
  • java创建线程的几种方式,以及它们之间的区别(面试常用)
    线程创建的几种方法继承Thread类。如果继承了Thread类,直接new一个对象就可以创建一个线程实现Runnable接口。如果实现了Runnable接口,则还需要用Thread的构造方法,才能创建一个线程//使用Thread类创建线程并启动线程publicclassThreadTestextendsThread{@Overrid......
  • JAVA线程资源共享问题
    JAVA多线程共享资源问题场景引入这个场景是一个典型的多线程共享资源的场景,主要目的是测试和观察多个线程对共享变量sum进行并发操作时是否会出现线程安全问题场景描述共享资源:共享变量sum,初始值为0。多个线程同时对sum进行操作,一个线程负责自增操作,另一个线程负责自......
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【2.3】RK3588上使用C++启用多线程推理更多内容
    本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。B站配套视频:https://www.bilibili.com/video/BV1or421T74f基础背景对于国产化芯片来说,是采用NPU进......
  • JAVA多线程的使用和创建的几种方式
    Thrad创建和使用创建实体类,继承Thread实现run()方法调用start()方法publicclassThreadDemoextendsThread{Loggerlogger=LoggerFactory.getLogger(ThreadDemo.class);privateStringtaskName;publicStringgetTaskName(){return......
  • 多线程系列:线程中包含子线程
    多线程系列:线程中包含子线程这里展示的多线程基本包含了常见的多线程操作:实现线程中包含子线程;计算子线程耗时展示一个函数如何通过参数传递进行多线程一个线程调用一个函数的情况代码示例importthreadingimporttimefrompprintimportpprintimportqueue#假......
  • 多线程学习总结
    Java多线程学习总结本章目标理解线程的基本概念理解线程与进程的区别熟悉线程的实现方式了解线程的管理熟悉线程的生命周期掌握线程同步掌握线程池了解线程通信掌握线程定时器什么是进程进程就是正在运行的程序,它是系统进行资源分配和调度的基本单位,各个进程之间......
  • Java多线程编程中的常见问题及优化策略
    Java多线程编程中的常见问题及优化策略大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!多线程的基本概念在Java中,多线程是指程序中可以同时运行多个线程,每个线程可以执行不同的任务。多线程可以提高程序的执行效率,但同时也带来了一些挑战。线程安全......
  • 「Android面试」Android 子线程为什么直接更新UI?
    本文将从子线程不能更新UI的直接原因、根本原因、Android如何做到限制以及子线程该如何正确更新UI四个方向回答问题。【直接原因】在子线程中更新UI会怎样?程序会出现以下错误:Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews. 【根本原因......
  • java之多线程篇
    一、基本概念1.什么是线程?线程就是,操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解就是:应用软件中互相独立,可以同时运行的功能2.什么是多线程?有了多线程,我们就可以让程序同时做多件事情3.多线程的作用?提高效率4.线程的应用场......