java线程中的死锁_Java多线程中的死锁 - Break易站

本文介绍了Java中多线程环境下可能导致死锁的原理和条件,包括资源的请求、保持与等待,以及No Preemption和循环等待。通过一个简单的示例展示了死锁现象,展示了两个线程互相等待对方释放资源而陷入僵局。同时,文章讨论了处理死锁的三种方法:预防、检测与恢复、忽略。最后,提供了如何避免Java死锁的建议,如避免嵌套锁、不必要的锁以及使用线程连接等策略。
摘要由CSDN通过智能技术生成

Java 多线程

synchronized关键字用于使类或方法线程安全,这意味着只有一个线程可以锁定同步方法并使用它,其他线程必须等到锁定释放并且其中任何一个获得该锁定。

如果我们的程序在多线程环境中运行,并且两个或多个线程同时执行,则使用它非常重要。但有时它也会导致一个叫做死锁的问题。

Java中死锁的介绍

操作系统中的进程使用不同的资源并以下列方式使用资源。

1)请求资源

2)使用资源

2)释放资源

死锁是一组进程被阻塞的情况,因为每个进程都持有一个资源并等待某个其他进程获取的另一个资源。

考虑一个例子,当两列火车在同一轨道上相互靠近并且只有一条轨道时,一旦它们在彼此前面,没有一列列车可以移动。当有两个或多个进程持有某些资源并等待其他资源持有的资源时,在操作系统中会出现类似的情况。例如,在下图中,进程1保持资源1并等待由进程2获取的资源2,并且进程2正在等待资源1。

deadlock.png

如果同时遵循四个条件,则可能出现死锁(必要条件)

相互排斥:一个或多个资源是不可共享的(一次只能使用一个进程)

保持和等待:进程至少保留一个资源并等待对于资源。

No Preemption:除非进程释放资源,否则无法从进程中获取资源。

循环等待:一组进程以循环形式相互等待。

处理死锁的方法

有三种方法可以处理死锁

1)死锁防止或避免:想法是不让系统进入死锁状态。

2)死锁检测和恢复:发生死锁,然后抢先处理它一旦发生。

3)一起忽略问题:如果死锁非常罕见,那就让它发生并重启系统。这是Windows和UNIX采用的方法。

Java死锁条件的一个简单示例

22-2.png

// Java program to illustrate Deadlock

// in multithreading.

class Util

{

// Util class to sleep a thread

static void sleep(long millis)

{

try

{

Thread.sleep(millis);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

// This class is shared by both threads

class Shared

{

// first synchronized method

synchronized void test1(Shared s2)

{

System.out.println("test1-begin");

Util.sleep(1000);

// taking object lock of s2 enters

// into test2 method

s2.test2(this);

System.out.println("test1-end");

}

// second synchronized method

sy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值