概念:两个或多个线程一直在相互等待其他线程完成而使得所有线程都始终处在阻塞的状态

死锁产生的四个必要条件:

1>资源互斥使用性,即当资源被一个线程使用(占有)时,别的线程不能使用

2>资源的不可抢占,资源请求者不能强制从资源占有者手中夺取资源,资源只能由资源占有者主动释放。

3>执行者请求和保持,即当资源请求者在请求其他的资源的同时保持对原有资源的占用。

4>执行者循环等待,即存在一个等待队列:P1占有P2的资源,P2占有P3的资源,P3占有P1的资源。这样就形成了一个等待环路。

查看死锁:

1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开。

2>直接使用JVM自带的命令

1)首先通过 jps 命令查看需要查看的Java进程的vmid

2)然后利用 jstack 查看该进程中的堆栈情况,在cmd中输入 jstack -l 7412。

避免死锁:

解决方式:

1)java.util.concurrent.locks.Lock

ReentrantLock

ReentrantReadWriteLock

尽量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock), 设置超时时间,超时可以退出防止死锁。

2)尽量使用java.util.concurrent(jdk 1.5以上)包的并发类代替手写控制并发,

比较常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,实际应用中java.util.concurrent.atomic十分有用,简单方便且效率比使用Lock更高。

3)尽量降低锁的使用粒度,尽量不要几个功能用同一把锁,能锁块不锁方

4)尽量减少同步的代码块,synchronized

5)检查线程的执行顺序,避免资源竞争。

目前,Java语言已经广泛应用于生活中的各个领域,无论是网络编程还是数据库编程,甚至是web开发都有Java语言的身影。很多小伙伴都喜欢在网上寻找教程,但遗憾的是很多小伙伴看完教程后都一头雾水,即便是学会了也是一知半解,如果你真的想学习JAVA 推荐你一个群【521595826】,只要你有一颗想学习的心就肯定能学会,不是想学习的就不要加了,不然也只是在浪费时间。

Java避免抢一个单_java死锁和避免死锁相关推荐

  1. java自定义封装一个方法_Java自定义套件封装教程

    Java自定义套件封装教程 时间:2017-07-28     来源:华清远见JAVA学院 各位亲爱的小伙伴们大家好,近很多伙伴都问我该怎么做Java自定义套件封装,今天华清Java学院小编在这里做了 ...

  2. java 多进程写一个文件_java高并发多线程及多进程同时写入文件研究

    测试&思考: 环境:windows 七.linux centos 6.三.java8html java多线程同时写一个文件 java高并发环境下多线程同时写入一个文件时, 经过 FileLoc ...

  3. java多线程调用一个函数_Java 多线程(一)

    1. 多线程使用方法 使用多线程,绝大部分情况都是通过如下两种方式实现的,即继承Thread类或者实现Runnable接口.以下对两种方式分别进行介绍并比较. 1.1 使用Thread类实现多线程 自 ...

  4. java 页面输出一个页面_java学习之:一个完整页面输出信息的过程(以输出Doctor表中信息为例)...

    最近在练习java程序,总结一下从数据库查询信息并输出到jsp页面的过程.主要数据处理在src.cn.javatest包下面 项目预览 1,配置项目根目录src目录下的druid.properties ...

  5. java并发执行一个方法_JAVA的执行并发原理

    Volatile Volatile关键字用于确保共享数据的可见性与有序性,但是并不能保证方法的原子性,在程序中对Volatile关键字使用得当的话,它比synchronized的使用和执行成本会更低, ...

  6. java list最后一个元素_Java实现寻找列表List中最后一个元素

    Java实现寻找列表List中最后一个元素 如何在一个元素列表List中找到最后一个元素? import java.util.LinkedList; import java.util.List; im ...

  7. java中定义一个时间_Java中的日期和时间

    根据个人目前正在编写的<Java核心编程-基础篇>的规划,这部分属于第15章内容,这里沿用了书中的章节编号.另外,因为原文篇幅太长,这里适当做了删减. 15.1.概述 在 Java 8 之 ...

  8. java 怎样卸载一个类_java 类型卸载问题

    1.自定义类加载器,可以将其设置为unreachable状态 再通过GC卸载掉类 2.使用系统类加载器,但是不能将其设置为unreacheable状态 由于不能直接将系统类加载器设置为unreacha ...

  9. java list最后一个元素_Java 8 Stream List 获取最后一个元素

    在Java 8中,我们可以使用reduce或skip获取Stream的最后一个元素. 1. Stream.reduce Java8Example1.java package com.mkyong; i ...

最新文章

  1. 【C++】C++11的enum class enum struct和enum
  2. java 坦克重叠_坦克大战中坦克一直有重叠是怎么回事
  3. 7项最佳实践助您利用媒体转换不断发展数据中心网络
  4. odoo8.0+PyCharm4.5开发环境配置
  5. 《c语言从入门到精通》看书笔记——第6章 选择结构程序设计
  6. mysql基本命令入门
  7. 集团公司(嵌入ETL工具)财务报表系统解决方案
  8. openstack网络服务neutron (控制节点)
  9. Oracle 12cR2发布,金融行业准备大规模上了
  10. 前端容易忽略的 debugger 调试技巧
  11. html+text+shadow语法,text-shadow属性怎么用
  12. SR-IOV虚拟出来的网卡如何被VPP(DPDK)接管
  13. 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
  14. 恩智浦+飞思卡尔后你需要知道的十件事
  15. DependencyResolutionException 此异常的解决办法
  16. 前端开发----微信小程序入门级教程(前篇)
  17. 智能硬件泡沫: 巨头进场才能彻底催熟产业
  18. C语言记录支出的程序,家庭支出管理系统—c语言程序设计教案.doc
  19. 快速上手RaphaelJS
  20. 在html中显示本地图片

热门文章

  1. 计算机学域名,从计算机域名到 IP地址的翻译过程称为 。
  2. 基于matlab的磁悬浮控制系统,基于MATLAB的磁悬浮控制系统研究
  3. anaconda 安装tensorflow1.9
  4. wmplayer参数说明
  5. 魅蓝Note2 在Android Studio 与 Eclipse中无法被检测到
  6. MM T-code大全
  7. 鲁大师4月新机性能/流畅榜:vivo霸榜,最流畅折叠屏手机出现
  8. Java并发编程(中下篇)从入门到深入 超详细笔记
  9. 基于 go-zero 实现网盘系统
  10. postman使用post传入参数_Postman接口测试之POST、GET请求方法