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锁) 两者都在等待对方释放握住的锁,而释放锁的条件是执行完代码,但是执行完代码的条件是需要对方释放锁。。。。此时进入死锁。

  • 相关阅读:
    json字符串与java对象的相互转换(jackson)
    EventBus的使用
    android 定时任务
    使用FlaycoBanner实现图片轮播效果(加载网络图片)
    okHttp使用
    Android 终于官方支持按百分比来设置控件的宽高了
    Android下使用Properties文件保存程序设置
    google vr开源 cardboard
    Android开源控件PhotoView的使用
    Android 布局优化
  • 原文地址:https://www.cnblogs.com/lixia0604/p/13443257.html
Copyright © 2011-2022 走看看