美文网首页
Java死锁范例

Java死锁范例

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

这种 有嵌套 会死锁

package Java死锁范例;

public class ThreadDeadlock {
     
    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 SyncThread(obj1, obj2), "t1");
        Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
        Thread t3 = new Thread(new SyncThread(obj3, obj1), "t3");
 
        t1.start();
        Thread.sleep(5000);
        t2.start();
        Thread.sleep(5000);
        t3.start();
    }
 
}
 
class SyncThread implements Runnable{
    private Object obj1;
    private Object obj2;
 
    public SyncThread(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 + "  准备锁 "+obj2);
             synchronized (obj2) {
                System.out.println(name + " 锁定 "+obj2);
                System.out.println("---------------------------------------------------------");
                work();//睡眠替代
             }
             System.out.println(name + "  释放 锁 "+obj2);
        }
        System.out.println(name + "  释放 锁 "+obj1);
        System.out.println("---------------------------------------------------------");
        System.out.println(name + " finished execution.");
    }
    
    
    private void work() {
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

结果:

t1  准备锁 java.lang.Object@655c512b
t1 锁定 java.lang.Object@655c512b
t2  准备锁 java.lang.Object@7cb4e65d
t2 锁定 java.lang.Object@7cb4e65d
t3  准备锁 java.lang.Object@a8f72d1
t3 锁定 java.lang.Object@a8f72d1
---------------------------------------------------------
t1  准备锁 java.lang.Object@7cb4e65d
---------------------------------------------------------
t2  准备锁 java.lang.Object@a8f72d1
---------------------------------------------------------
t3  准备锁 java.lang.Object@655c512b

相关文章

  • Java死锁范例

    这种 有嵌套 会死锁 结果:

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

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

  • Java死锁检测之ThreadMXBean

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

  • Java concurrency《防止死锁》

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

  • 如何去检测死锁

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

  • 死锁

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

  • Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁。 代码如下:Program.java...

  • JVM_JMM: 死锁的检测

    死锁的示例代码: 通过jconsole来检测死锁: 名称: Thread-1状态: java.lang.Class...

  • java死锁介绍、源码实现及预防(含源码)

    java死锁介绍、源码实现及预防(含源码) 什么是死锁 死锁是 多个线程 之间 相互之间 持有 对方需要的资源,同...

  • Java高并发 -- 并发扩展

    Java高并发 -- 并发扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 死锁 死锁是指...

网友评论

      本文标题:Java死锁范例

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