美文网首页
java中死锁的问题

java中死锁的问题

作者: YOUNG_FAN | 来源:发表于2017-11-04 20:20 被阅读0次

死锁。

死锁的原因:同步中嵌套同步,多个进程同时抢到不同的锁,都在等待,互不相让

在该程序中, 假如线程0在run方法中打开obj锁,同时1线程在show方法打开this锁,

此时下一步 ,线程0和线程1都需要双方的锁,故都在等待,从而出现了死锁

class Ticket implements Runnable {
    
    private  int tick = 100;
    Object obj = new Object();
    boolean flag = true;
    public void run() {  
        if (flag) {
            while(true) {
                synchronized(obj) {//这个obj锁与28行的obj是同一个锁,虽然锁的位置不一样
                    show();
                }
            }
        }
        else                                  
            while(true)
                this.show();
        
    }
    
    public synchronized void show() {  //this锁
        synchronized(obj) {
            if (tick>0) {
                try{Thread.sleep(10);}catch(Exception e){}
                System.out.println(Thread.currentThread().getName()+"code: "+tick--);
            }
        }
        
    }
    
}

class DeadLockDemo {

    public static void main(String[] args) {
        Ticket t = new Ticket();
        
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);

        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}  
        t.flag = false;
        t2.start();
        
    }
}

练习

if和else中,如果两个线程各自都抢到了一把锁,则死锁,

若某个线程提前抢到了两把锁 则不会出现死锁了

class Test implements Runnable {
    
    private boolean flag;
    Test(boolean flag) {
        this.flag = flag;
    }
    public void run() {
        if (flag) {
            synchronized(MyLock.locka) {
                System.out.println("if locka");
                synchronized(MyLock.lockb) {
                    System.out.println("if lockb");
                }
            }
        }
        else {
            synchronized(MyLock.lockb) {
                System.out.println("else lockb");
                synchronized(MyLock.locka) {
                    System.out.println("else lockb");
                }
            }
        }
    }
    
}

class MyLock {
    static Object locka = new Object();  //静态后方便直接调用
    static Object lockb = new Object();
}

class DeadLockTest {

    public static void main(String[] args) {
        Thread t1 = new Thread(new Test(true));
        Thread t2 = new Thread(new Test(false));
        t1.start();
        try{Thread.sleep(10);}catch(Exception e){}  //加上就不死锁了,不加可能死锁
        t2.start();
    }
}

相关文章

  • java中死锁的问题

    死锁。 死锁的原因:同步中嵌套同步,多个进程同时抢到不同的锁,都在等待,互不相让 在该程序中, 假如线程0在r...

  • Java死锁检测之ThreadMXBean

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

  • 并发编程之死锁解析

    前言 在 Java 的并发编程中,有一个问题需要特别注意,那就是死锁,如果发生了死锁,基本就是重启,而重启将会丢失...

  • 死锁

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

  • Java中的死锁

    定义两个或者两个以上的线程在执行的过程中,因资源竞争造成的相互等待,无法继续执行下去。 造成死锁的原因系统资源的竞...

  • Java Concurrent 死锁

    前言 死锁是一个比较大的概念,在并发场景下的加锁行为都有可能产生死锁问题。在Java 并发编程中会有死锁,操作系统...

  • Java面试问题,如何避免Java线程中的死锁?

    如何避免Java中的死锁?是流行的Java面试问题之一,也是多线程的流行话题之一。尽管问题看起来很简单,但是一旦深...

  • JAVA中死锁问题排查和预防

    在Java多线程开发中死锁问题并不少见,当线程间相互等待资源,而又不释放自身的资源时就会导致无穷无尽的等待。 举一...

  • java死锁问题排查

    首先熟悉一下jstack命令的用法,主要参数有-F -l -m 如下图: 模拟一段死锁的java代码,如下: ``...

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

网友评论

      本文标题:java中死锁的问题

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