当前位置:首页 > 编程教程 > java技术文章 > Java多线程产生死锁的必要条件

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

  • 发布时间:
  • 作者:码农之家
  • 点击:64

这篇文章主要知识点是关于java死锁条件、java多线程、多线程死锁、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

自己动手写Java虚拟机
  • 类型:Java大小:4.27 MB格式:PDF作者:张秀宏
立即下载

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

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

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

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

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

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

  • 1,必须有2个或以上的线程。一个线程是不会产生死锁的,它顶多产生等待。
  • 2,必须有2个临界资源,即,必须有2个锁。这也是死锁产生的必要的条件。当只有一个临界资源,或者说只有一个锁时,当一个线程获取了锁,另一个线程虽然暂时无法获取锁,但它至多也就是需要进行等待。而不会陷入死锁。
  • 3,两个线程,每个线程都获取了其中的一个锁,但为了完成工作,还需对方的另一个锁。这种情况下,才会产生死锁。这种情况也称为循环等待。
  • 4,不可剥夺。

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

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

  • 固定加锁的顺序(针对锁顺序死锁)
  • 开放调用(针对对象之间协作造成的死锁)
  • 使用定时锁-->tryLock()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对码农之家的支持。如果你想了解更多相关内容请查看下面相关链接

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Java 相关电子书
学习笔记
网友NO.639561

java实现多人多牌数比较游戏

本文实例为大家分享了java实现多人多牌数比较游戏的具体代码,供大家参考,具体内容如下 具体实现步骤如下: 实现扑克Card类,用于储存扑克牌,1-13代表点数,4-1代表花色(黑桃,红桃,梅花,分块) 实现扑克列表CardList类,用于实现生成一副牌,洗牌,发牌的功能 实现玩家Player类,用于储存玩家信息 实现玩家列表PlayerList类,用于储存所有玩家信息,并且实现玩家洗牌、发牌、比较牌大小的方法 主方法Index05类,用于启动扑克游戏 Card.java /** * */package dk.card; /** * @author Administrator * 扑克类 */public class Card implements ComparableCard{ private int number;//牌的点数--1到13 private int type;//牌的花色--4种花色:♠(黑桃):4 ♥(红桃):3 ♣(梅花):2 方块:1 public Card() { super(); } public Card(int number, int type){ if(number==1) number=14; this.number = number; this.type = type; } public int getNumber() { retu……

网友NO.165767

详解JavaScript中void语句的使用

void是在JavaScript中的一个重要的关键字可被用作其单操作数之前出现一元运算符,其可以是任何类型。 此运算符指定不需要返回值,进行计算的表达式。它的语法可能是下列之一: headscript type="text/javascript"!--void func()javascript:void func() or: void(func())javascript:void(func())//--/script/head 实例1: 这个操作最常见的用途是在客户端JavaScript:URL,它可以评估计算其边界效应的表达式,而不显示计算表达式的值的浏览器。 在这里,表达 alert('Warning!!!') 进行评估计算,但没有加载回当前文档: headscript type="text/javascript"!--//--/script/headbodya href="javascript:void(alert('Warning!!!'))"Click me!/a/body 实例2: 另一例子下面的链接什么也不做,因为表达式“0”在JavaScript中没有任何影响。这里,表达式“0”被评估计算,但它不被装入回当前文档: headscript type="text/javascript"!--//--/script/headbodya ……

网友NO.948408

Java实现批量下载选中文件功能

1.在action中定义变量 private ListString downLoadPaths = new ArrayListString();//存储选中文件的下载地址 private OutputStream res; private ZipOutputStream zos; private String outPath; private String lessionIdStr;// 选中文件ID拼接的字符串 private String fileName; //浏览器下载弹出框中显示的文件名 分别给出get和set方法 2. 主方法 /** * 下载多个文件:压缩成zip * * @return * @throws Exception */ public String downLoadLessionsZip() { downLoadPaths.clear(); String firstFileName = "";// 第一个文件的文件名 ListDownLoadFileVo fileVos = new LinkedListDownLoadFileVo(); if (StringUtils.isNotEmpty(lessionIdStr)) { int end = lessionIdStr.lastIndexOf(","); if (end 0) { if (end == lessionIdStr.length() - 1) { lessionIdStr = lessionIdStr.substring(0, end); } String[] ids = lessionIdStr.split(","); for (int i = 0; i ids.length; i++) { if (StringUtils.isNumeric(ids[i])) { BkPersonLession lession = bkPersonLessionService.downLoadLession(Int……

网友NO.604581

了解JavaScript中的选择器

在html5之前只有下面四种选择器 .getElementById("id")id选择器; .getElementsByName("name")name选择器; .getElementsByTagName("tagname")tag标签名选择器; .getElementsByClassName(".classname").class名选择器 示例代码: !DOCTYPE html html head meta charset="utf-8" titleJavaScript选择器/title style .div{ border: 2px solid red; } p{ color: red; } /style /head body pid选择器/p div id="first"/div pname选择器/p div name="first"/div div name="first"/div ptag标签选择器/p span/span span/span pcss中.class选择器/p div class="div"/div div class="div"/div /body script document.getElementById("first").innerHTML="h4我是id选择器效果/h4"; document.getElementsByName("first")[0].innerHTML="h4我是第一个name选择器效果/h4"; document.getElementsByName("first")[1].innerHTML="h4我是第二个name选择器效果/h4"; document.getElementsByTagName("span")[0].innerHTML="h4我是第一个tag选择器效果/h4"; document.getElementsByTagName("span")[1].……

网友NO.168298

Java数据结构之双端链表原理与实现方法

本文实例讲述了Java数据结构之双端链表原理与实现方法。分享给大家供大家参考,具体如下: 一、概述: 1、什么时双端链表: 链表中保持这对最后一个连点引用的链表 2、从头部插入 要对链表进行判断,如果为空则设置尾节点为新添加的节点 3、从尾部进行插入 如果链表为空,则直接设置头节点为新添加的节点,否则设置尾节点的后一个节点为新添加的节点 4、从头部删除 判断节点是否有下个节点,如果没有则设置节点为null 二、具体实现 /** * @描述 头尾相接的链表 * @项目名称 Java_DataStruct * @包名 com.struct.linklist * @类名 LinkList * @author chenlin * @date 2010年6月26日 上午8:00:28 * @version 1.0 */public class FirstLastLinkList { //头 private Node first; //尾 private Node last; public FirstLastLinkList(){ first = null; last = null; } /** * 插入数据 * @param value */ public void insertFirst(long value){ Node……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com