Java多线程产生死锁的必要条件

作者:李灿辉 时间:2023-04-02 00:20:24 

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代码块时,便占有了资源,直到它退出该代码块或者调用wait方法,才释放资源,在此期间,其他线程将不能进入该代码块。当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

死锁是操作系统里里面的一个重要的概念,死锁通常发生在并发的场景里。

死锁是多个进程或线程,彼此争抢资源而陷入僵局的一种情况。

在笔者参加的多次面试中,发现不少候选人虽然大概知道死锁是一种因为争抢资源引起的问题,但真的要写一个死锁的例子的话,还是有不少候选人不知道该如何下手。

其实,真正理清楚了死锁产生的必要的条件,写出一个死锁的例子并不困难。那么,就java的多线程而言,产生死锁有哪些必要条件呢?

  • 1,必须有2个或以上的线程。一个线程是不会产生死锁的,它顶多产生等待。

  • 2,必须有2个临界资源,即,必须有2个锁。这也是死锁产生的必要的条件。当只有一个临界资源,或者说只有一个锁时,当一个线程获取了锁,另一个线程虽然暂时无法获取锁,但它至多也就是需要进行等待。而不会陷入死锁。

  • 3,两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。这种情况下,才会产生死锁。这种情况也称为循环等待。

  • 4,不可剥夺。

以上即为死锁产生的必要条件。

避免死锁可以概括成三种方法:

  • 固定加锁的顺序(针对锁顺序死锁)

  • 开放调用(针对对象之间协作造成的死锁)

  • 使用定时锁-->tryLock()

来源:https://blog.csdn.net/li_canhui/article/details/85298236

标签:java,死锁,条件
0
投稿

猜你喜欢

  • C#图像处理之图像均值方差计算的方法

    2023-12-10 17:35:33
  • Spring Boot Actuator监控端点小结

    2023-02-15 05:04:23
  • SpringBoot全局异常与数据校验的方法

    2023-12-11 10:46:06
  • C语言与C++中关于字符串使用的比较

    2022-01-22 01:30:37
  • Android SharedPreferences存取操作以及封装详解

    2022-11-02 07:10:19
  • Android编程入门之HelloWorld项目目录结构分析

    2022-07-23 23:34:40
  • Android编程判断网络是否可用及调用系统设置项的方法

    2023-08-14 13:05:22
  • Android实现多段颜色进度条效果

    2023-09-30 22:07:51
  • JPA Specification常用查询+排序实例

    2023-11-23 04:56:32
  • java编写的文件管理器代码分享

    2023-11-20 13:28:52
  • Java链表数据结构及其简单使用方法解析

    2022-11-20 23:42:53
  • Spring boot集成Mybatis的方法教程

    2023-11-25 06:20:41
  • Android App中ListView仿QQ实现滑动删除效果的要点解析

    2022-11-22 03:05:57
  • springboot 集成redission 以及分布式锁的使用详解

    2023-06-20 06:48:43
  • Java 导出excel进行换行的案例

    2021-07-29 04:09:36
  • Java8中Stream的一些神操作

    2021-11-18 19:07:21
  • android RecyclerView实现条目Item拖拽排序与滑动删除

    2023-03-20 20:50:36
  • Java实现提取QSV文件视频内容

    2023-08-24 13:33:45
  • Java关于JDK1.8新特性的Stream流

    2021-06-02 11:36:35
  • springMVC利用FastJson接口返回json数据相关配置详解

    2023-02-24 10:51:58
  • asp之家 软件编程 m.aspxhome.com