当前位置:   article > 正文

【面试:并发篇21:多线程:活跃性】死锁、活锁、饥饿_操作系统饥饿死锁类代码题

操作系统饥饿死锁类代码题

【面试:并发篇21:多线程:活跃性】死锁、活锁、饥饿

00.前言

如果有任何问题请指出,感谢。

01.介绍

死锁:两个线程 t1 t2,两把锁 A B,t1持有A锁 t2持有B锁,此时t1想要再获得B锁 t2想要再获得A锁,但是它们都不释放自己所持有的锁,最终导致死锁。
活锁:两个线程互相改变对方的结束条件,导致最后谁也没办法结束
饥饿:多个线程中 有一个线程t,由于线程之间的冲突 导致t线程分的时间片低,导致t线程基本不运行,这种情况下t线程就处于饥饿

02.死锁

案例

两个线程 t1 t2,两把锁 A B,t1持有A锁 t2持有B锁,此时t1想要再获得B锁 t2想要再获得A锁

package cn.itcast.n4.deadlock;

import lombok.extern.slf4j.Slf4j;

import static cn.itcast.n2.util.Sleeper.sleep;

@Slf4j(topic = "c.TestDeadLock")
public class TestDeadLock {
   
    public static void main(String[] args) {
   
        test1();
    }

    private static void test1() {
   
        Object A = new Object();
        Object B = new Object();
        Thread t1 = new Thread(() -> {
   
            synchronized (A) {
   
                log.debug("lock A");
                sleep(1);
                synchronized (B) {
   
                    log.debug("lock B");
                    log.debug("操作...");
                }
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
   
            synchronized (B) {
   
                log.debug("lock B");
                sleep(0.5);
                synchronized (A) {
   
                    log.debug("lock A");
                    log.debug("操作...");
                }
            }
        }, "t2");
        t1.start
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/772022
推荐阅读
相关标签
  

闽ICP备14008679号