zoukankan      html  css  js  c++  java
  • 死锁的简单实现

    死锁的四个必要条件:

    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) {
            }
        }
    }
  • 相关阅读:
    Android UI中英文自动显示问题
    HTTP通信过程原理
    [转] Protobuf高效结构化数据存储格式
    常用json解析库比较及选择 fastjson & gson
    [转]深入Android内存泄露
    [转]Android 如何有效的解决内存泄漏的问题
    Android View 滚动边界的测量
    Oracle查看表之间的约束
    LINUX学习笔记——LINUX下EXP命令全库备份数据库文件
    LINUX档案权限
  • 原文地址:https://www.cnblogs.com/huntfor/p/3986325.html
Copyright © 2011-2022 走看看