美文网首页
Java死锁范例和 对应解决方案

Java死锁范例和 对应解决方案

作者: 欢乐时光欢乐你我 | 来源:发表于2019-04-27 13:27 被阅读0次

synchronized 没有嵌套 不会死锁

package Java死锁范例;

public class ThreadDeadlock2 {
    //这种  没有嵌套   不会死锁
    public static void main(String[] args) throws InterruptedException {
        Object obj1 = new Object();
        Object obj2 = new Object();
        Object obj3 = new Object();
 
        Thread t1 = new Thread(new SyncThread2(obj1, obj2), "t1");
        Thread t2 = new Thread(new SyncThread2(obj2, obj3), "t2");
        Thread t3 = new Thread(new SyncThread2(obj3, obj1), "t3");
 
        t1.start();
        Thread.sleep(5000);
        t2.start();
        Thread.sleep(5000);
        t3.start();
        
        
 
    }
 
}
 
class SyncThread2 implements Runnable{
    private Object obj1;
    private Object obj2;
 
    public SyncThread2(Object o1, Object o2){
        this.obj1=o1;
        this.obj2=o2;
    }
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + " 准备锁"+obj1);
        //这种  没有嵌套   不会死锁
        synchronized (obj1) {
             System.out.println(name + " 锁定 "+obj1);
             work();
             System.out.println("---------------------------------------------------------");
        }
        System.out.println(name + " 释放 锁"+obj1);
        
        System.out.println("---------------------------------------------------------");
        System.out.println(name + "准备锁"+obj2);
        synchronized (obj2) {
            System.out.println(name + " 锁定 "+obj2);
            work();
        }
        System.out.println(name + " 释放锁"+ obj2 );
        
        System.out.println(name + "---------------------> finished execution.");
    }
    
    
    private void work() {
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果:

t1 准备锁java.lang.Object@3e9041fa
t1 锁定 java.lang.Object@3e9041fa
t2 准备锁java.lang.Object@a8f72d1
t2 锁定 java.lang.Object@a8f72d1
t3 准备锁java.lang.Object@76f1ebbf
t3 锁定 java.lang.Object@76f1ebbf
---------------------------------------------------------
t1 释放 锁java.lang.Object@3e9041fa
---------------------------------------------------------
t1准备锁java.lang.Object@a8f72d1
---------------------------------------------------------
t1 锁定 java.lang.Object@a8f72d1
t2 释放 锁java.lang.Object@a8f72d1
---------------------------------------------------------
t2准备锁java.lang.Object@76f1ebbf
---------------------------------------------------------
t3 释放 锁java.lang.Object@76f1ebbf
---------------------------------------------------------
t2 锁定 java.lang.Object@76f1ebbf
t3准备锁java.lang.Object@3e9041fa
t3 锁定 java.lang.Object@3e9041fa

相关文章

  • Java死锁范例和 对应解决方案

    synchronized 没有嵌套 不会死锁 结果:

  • Java死锁范例

    这种 有嵌套 会死锁 结果:

  • Java死锁检测之ThreadMXBean

    看此文章前请先了解之前一篇文章 "Java死锁之理解死锁" 中的死锁示例java 中提供了可以检测死锁的工具类Th...

  • 中级09 - Java多线程初步

    中级09 - Java多线程初步 介绍多线程带来的问题,以及基本解决方案。 竞争条件带来的数据错误问题 死锁的原...

  • Java concurrency《防止死锁》

    Java concurrency《防止死锁》 常见预防死锁的办法 有顺序的锁 具有超时时间的锁 死锁的检测 有顺序...

  • 如何去检测死锁

    如何检测死锁 死锁预防 让线程获取锁的顺序一致 死锁检测 jps 查看java 进程信息 jstack +进程号 ...

  • 说说GCD中的死锁

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • 552,GCD的死锁(面试点:gcd死锁:一,主线程调用主线程。

    本文主要举例说明GCD里的死锁场景,分析造成死锁的原因以及解决方案 在开始说GCD死锁之前,我们先了解一下GCD的...

  • Java编程入门

    第一单元:java平台概述 JAVA语言: 跟任何编程语言一样,Java 语言拥有自己的结构、语法规则和编程范例。...

  • 死锁

    在JAVA编程中,有3种典型的死锁类型: 静态的锁顺序死锁 动态的锁顺序死锁 协作对象之间发生的死锁 静态的锁顺序...

网友评论

      本文标题:Java死锁范例和 对应解决方案

      本文链接:https://www.haomeiwen.com/subject/iwxknqtx.html