• 死锁的简单实现


    死锁的四个必要条件:

    1. 互斥:资源不能多线程共享

    2. 不剥夺:线程不能强行剥夺其他线程持有的资源

    3. 请求与保持:线程请求它所需要的资源时,继续保持自己已持有的资源

    4. 环路等待:这个比较容易理解,多个线程的请求之间形成了一个环路。如果不理解,请看下面一个段子:

    【女儿】:妈妈,明早我要考试,5点钟一定要叫醒我。

    【女主】:好的。

    【女主】:老公,明早5点之前一定叫醒我

    【男主】:好的,刚好明早我要晨练

    【男主】:女儿,明早我要晨练,5点之前叫醒我。

    【女儿】:没问题,我明早要考试,肯定能起来。

    上面就形成了环路等待,于是一家三口睡到了自然醒。。。

    废话不多说,下面给出一个很简单的死锁的代码实现:

    线程-1 持有了A锁,线程-2持有了B锁,然后线程-1请求B锁,线程2请求A锁,这样就形成了死锁。

    代码如下:

    package thread;
    
    public class DeadLock {
        public static void main(String[] args) {
            Object lock1 = new Object();
            Object lock2 = new Object();
            Mt1 mt1 = new Mt1(lock1, lock2);
            Mt2 mt2 = new Mt2(lock1, lock2);
            mt1.start();
            mt2.start();
        }
    }
    
    class Mt1 extends Thread {
        Object s1 ;
        Object s2 ;
    
        public Mt1(Object lock1,Object lock2){
            this.s1 = lock1;
            this.s2 = lock2;
        } 
        public void run() {
            try {
                synchronized (s1) {
                    System.out.println("get lock1");
                    sleep(300);//持有了S1锁,并将自己挂起0.3秒,然后请求S2锁
                    synchronized (s2) {
                        System.out.println("get lock2");
                    }
                }
            } catch (Exception e) {
            }
        }
    }
    
    class  Mt2 extends Thread{
        Object s1 ;
        Object s2 ;
    
        public Mt2(Object lock1,Object lock2){
            this.s1 = lock1;
            this.s2 = lock2;
        } 
        public void run() {
            try {
                synchronized (s2) {
                    System.out.println("get lock2");//线程1将自己挂起的0.3秒内,线程2抢到了S2锁,并试图申请s1锁(此时S1锁已经被线程1持有,因此线程2挂起)synchronized (s1) {
                        System.out.println("get lock1");
                    }
                }
            } catch (Exception e) {
            }
        }
    }
  • 相关阅读:
    04_数字信号滤波Matlab代码_常见操作
    03_FIR滤波器的设计
    CH340 USB to TTL connect to STM32F207 TTL UART
    linux内核中如果内存越界破坏了semphore同样会导致RCU STALL
    Build自己的kernel header
    事实证明,PHY Identify在外部电路异常情况下也是会发生变化的。
    vim配置参考
    技术经典图书(附电子版下载地址)
    转:linux内核源代码分析方法
    定期保存2017-04-19
  • 原文地址:https://www.cnblogs.com/huntfor/p/3986325.html
Copyright © 2020-2023  润新知