java中死锁的概念是什么给个例子

10.死锁

当两个线程循环依赖于一对同步对象(monitor)时将发生死锁。例如:
一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,同时,反向的情况也发生,就将发生死锁。
死锁很少发生,但一旦发生就很难调试。

在以下例子中:a正在等待b释放,b也正在等待a释放,a怎么才能释放锁呢?只有a往前移动一个语句,执行完disp,a就能自动释放锁,但执行disp需要b释放锁,所以因为执行不了disp,所以a不能释放锁。b也一样,所以大家就在这互相等,从而发生了死锁。

对 于下面的例子1.start()作为一个线程,获得d1的锁。为什么?因为synchronized public void run().所以run()的synchronized不能去掉。d2.start()作为一个线程获得d2的锁。没有问题,所以打印出来两个“in ru”。然后,在d1's run()的 d.disp()使得d1试图从d2获得一个锁,因为在这一刻,d.disp()意味着d1.d.disp()= d2.disp(),意味着d1试图得到一个锁从d2,反之亦然。

如果任何synchronized 删除,不会发生死锁,但安全性降低。

例1.10.1

class DeadLockExam extends Thread {
    DeadLockExam d;

    synchronized void disp() {
        System.out.println("in di");
    }

    synchronized public void run() {
        System.out.println("in ru");
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
        }
        d.disp();
    }
}

更多请见:https://blog.youkuaiyun.com/qq_44639795/article/details/103095424

### Java 中发生死锁的具体示例 #### 死锁的概念 当两个或多个线程互相持有对方所需要的资源而不释放,导致这些线程都无法继续执行的现象称为死锁。 #### 示例代码展示 下面是一个简单的Java程序展示了如何创建死锁的情况: ```java public class DeadLock { private final Object left = new Object(); private final Object right = new Object(); public void leftRight() throws InterruptedException { synchronized (left) { System.out.println(Thread.currentThread().getName() + " acquired lock on 'left'"); Thread.sleep(2000); synchronized (right) { System.out.println("leftRight end!"); } } } public void rightLeft() throws InterruptedException { synchronized (right) { System.out.println(Thread.currentThread().getName() + " acquired lock on 'right'"); Thread.sleep(2000); synchronized (left) { System.out.println("rightLeft end!"); } } } } ``` 在这个例子中,`DeadLock`类中有两个同步方法`leftRight()`和`rightLeft()`。这两个方法分别试图按不同的顺序锁定相同的两个对象实例 `left` 和 `right` 。如果一个线程调用了`leftRight()`并获得了`left`的锁,在等待两秒之后它会尝试获取`right` 的锁;与此同时另一个线程可能已经通过调用`rightLeft()`得到了`right` 锁,并正在等待获得`left` 锁。这就形成了典型的循环等待条件,从而引发死锁[^1]。 为了验证上述情况确实会发生死锁,可以编写测试代码来启动两个线程,让它们分别运行以上提到的方法之一: ```java public static void main(String[] args){ final DeadLock dl = new DeadLock(); Thread t1 = new Thread(new Runnable(){ @Override public void run(){ try{ dl.leftRight(); } catch(Exception e){ e.printStackTrace(); } } }); Thread t2 = new Thread(new Runnable(){ @Override public void run(){ try{ dl.rightLeft(); } catch(Exception e){ e.printStackTrace(); } } }); t1.start(); t2.start(); } ``` 这段代码将会使两个线程几乎同时开始工作,其中一个先拿到左边的对象锁而后去请求右边的对象锁,而另一个则相反方向行事。最终结果很可能是两者陷入僵持状态——即所谓的“死锁”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mark_to_win

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值