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

    死锁:

      官方表达:线程1等待线程2互斥持有的资源,而线程2也在等待线程1互斥持有的资源。两条线程都无法继续执行。

      大白话:两个线程1、2,两个资源one、two,线程1抢占到了资源one,同时等待内嵌资源two的执行。同理线程2抢占到了资源two,同时等待内嵌的资源one的执行。由于线程2无法放弃所拥有的的资源two的锁,导致线程1无期限等待,同时线程2也无限期等待线程1释放资源one。由此产生“死锁”。

    示例代码:(摘抄所得

    package com.thread;
    
    public class DeathThreadDemo {
    
        public static void main(String[] args) {
            DeadLock dt0 = new DeadLock(0);
            DeadLock dt1 = new DeadLock(1);
            new Thread(dt0).start();
            new Thread(dt1).start();
        }
    }
    
    class DeadLock implements Runnable {
        private int value;
        private static Object o1 = new Object(), o2 = new Object();
    
        public DeadLock(int value) {
            this.value = value;
        }
    
        public void run() {
            if (value == 0) {
                synchronized (o1) {
                    try {
                        Thread.sleep(3000);
                        for (int i = 11; i < 20; i++) {
                            System.out.println("o1" + i);
                        }
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    synchronized (o2) {
                        System.out.println("o2" + value);
                    }
                }
            }
            if (value == 1) {
                synchronized (o2) {
                    try {
                        Thread.sleep(3000);
                        for (int i = 1; i < 10; i++) {
                            System.out.println("o2" + i);
                        }
    
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    synchronized (o1) {
                        System.out.println("o1" + value);
                    }
                }
            }
        }
    }

    注意:

    示例中写的很明显,资源互相嵌套,互相牵制,从而导致死锁,实际中,很多Java API内部方法用到了同步锁,这时就要小心了。

    例如:

    /**
         * Prints a String and then terminate the line.  This method behaves as
         * though it invokes <code>{@link #print(String)}</code> and then
         * <code>{@link #println()}</code>.
         *
         * @param x  The <code>String</code> to be printed.
         */
        public void println(String x) {
            synchronized (this) {
                print(x);
                newLine();
            }
        }

    以上代码是习以为常的 System.out.println(“打印”); 中println() 的源码。用到了同步方法。

  • 相关阅读:
    C++模板实战6:迭代器
    Hacking up an armv7s library
    Android之ListView分页数据加载
    Android 命令行打包和签名
    django 自定模板标签的注册
    [置顶] 高效能人士的七个习惯读书笔记(二)
    价格战拉上了Android平板电脑
    Synergy 多系统共享鼠标键盘 Windows 和 Mac 完全配置教程
    global planner源码阅读
    源码安装eigen
  • 原文地址:https://www.cnblogs.com/x-jingxin/p/10621639.html
Copyright © 2011-2022 走看看