zoukankan      html  css  js  c++  java
  • 死锁问题

    1.死锁的理解
    不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

    2.说明:
    * 1出现死锁后,不会出现异常,不会出现提示,只是所的线程都处于阻塞状态,无法继续
    * 2我们使用同步时,要避免出现死锁。

    package main.exer;
    
    /**
     * @Author lx
     * @Description 死锁问题
     * @Date 21:39 2020/8/5
     * @Version
     */
    public class DeadLock {
        public static void main(String[] args) {
            StringBuffer s1 = new StringBuffer();
            StringBuffer s2 = new StringBuffer();
    
            new Thread(){
            @Override
            public void run() {
                synchronized (s1){
                    s1.append("a");
                    s2.append("1");
    
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (s2){
                        s1.append("b");
                        s2.append("2");
    
                        System.out.println(s1);
                        System.out.println(s2);
                    }
                }
            }
        }.start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (s2){
                        s1.append("c");
                        s2.append("3");
    
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        synchronized (s1){
                            s1.append("d");
                            s2.append("4");
    
    
                            System.out.println(s1);
                            System.out.println(s2);
                        }
    
                    }
    
                }
            }).start();
    
        }
    
    
    }

    此例中创建了两个线程 当两个线程同时开始执行时 

    线程一遇到synchronized握住s1锁 向下执行 同时线程二遇到synchronized握住s2锁,两个线程同时向下执行,

    当线程一又遇到synchronized还需要握住s2锁才能继续执行代码,而线程2同时遇到synchronizedye需要握住s1锁才能执行。

    (注意此时线程一并没有释放s1锁,线程二没有释放s2锁) 两者都在等待对方释放握住的锁,而释放锁的条件是执行完代码,但是执行完代码的条件是需要对方释放锁。。。。此时进入死锁。

  • 相关阅读:
    arm gdbserver armlinuxgdb
    建立非模态对话框与在线程中建立非模态对话框
    AutoLock C++
    Uboot bootcmd 和bootargs
    SetRegistryKey
    飞凌OK6410 uboot支持网络
    uboot 源码修改 bootcmd,IP ,BOOTARGS等参数
    TextBox(richTextBox) 光标和滚动条到文本末尾
    Windbg中使用查找内存并设置访问断点
    opencv EXAMPLES 编译 VS2010 (C++)
  • 原文地址:https://www.cnblogs.com/lixia0604/p/13443257.html
Copyright © 2011-2022 走看看