zoukankan      html  css  js  c++  java
  • Java 死锁

    什么是死锁?

    当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,当线程A持有锁1想获取锁2,当线程B持有锁2想获取锁1 这种情况下就会产生2个线程一直在阻塞等待其他线程释放锁1 锁2 就会造成死锁。

    下面我们来看一下死锁的示例:

    package cn.com.example;
    
    /**
     * Created by Jack on 2017/2/10.
     */
    public class DeadLock {
    
        private static Object o1 = new Object(), o2 = new Object();
    
        public static void main(String[] args) {
            Thread t1 = new Thread(new DeadLockThread(1, o1, o2));
            Thread t2 = new Thread(new DeadLockThread(2, o1, o2));
    
            t1.start();
            t2.start();
        }
    }
    
    class DeadLockThread implements Runnable {
        private int i;
    
        private Object o1;
    
        private Object o2;
    
        public DeadLockThread(int i, Object o1, Object o2) {
            this.i = i;
            this.o1 = o1;
            this.o2 = o2;
        }
    
        @Override
        public void run() {
            if (i == 1) {
                synchronized (o1) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("i = 1 synchronized o1");
                    synchronized (o2) {
                        System.out.println("i = 1 synchronized o2");
                    }
                }
            } else if (i == 2) {
                synchronized (o2) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("i = 2 synchronized o2");
                    synchronized (o1) {
                        System.out.println("i = 2 synchronized o1");
                    }
                }
            }
        }
    }
    

    输出:

    i = 1 synchronized o1
    i = 2 synchronized o2
    

    后面什么都不输出了, 为什么要 Thread.sleep(500);  是怕 某个线程先运行 抢占了 o1 o2 的锁。

  • 相关阅读:
    [帮助文档] [SageMath Thematic Tutorial] Chapter 10 使用Sagemath进行数值计算
    [转]dd命令、cp命令详解+dd命令、cp命令对比 delong
    MBR内容解析
    记一个编译错误:命名冲突、宏定义、头文件包含顺序
    防止STL容器迭代器失效
    日历时间
    观点
    编码规范
    《转》impress.js页面PPT
    <转>Spring Test 整合 JUnit 4 使用总结
  • 原文地址:https://www.cnblogs.com/Zombie-Xian/p/6386806.html
Copyright © 2011-2022 走看看