死锁的两种情况:

简单的说下单块cpu运行多线程的情况:

大家可能平时玩电脑,可以同时挂QQ啊,玩游戏啊,打开文本啊,等等。这里,我们假设是单块cpu。也就是俗称的单核cpu。

大家可能会觉得这些软件,这些线程是同时运行的,

其实不然,其实在任何一种情况下,电脑都只运行一个线程!

只是因为这个单块的cpu内部为我们划分了很多很多的时间块,

而这个时间的划分是以纳秒为单位的,也就是说,这个10纳秒我运行这个线程,下个10纳秒运行另外一个线程(或者又被上一个线程抢到了(只是被上一个线程抢到的概率小,这是cpu调度器的算法决定了的),它会慢慢平衡的,不可能一直让某一个线程一直抢占cpu调度器资源),所以说,它运行并不是连续的,只是间隔时间太短,我们感觉不出来而已!!!

第一种情况:

1)多个线程共用同一个对象锁,互相等待。

两个线程共用一个锁,一个线程拿着锁来调用另外一个线程,于是出现了死锁情况!package thread.deadLock.lock1;/** * 简单的类 *@author 陈浩翔 * * 2021年05月26日 */public class S { public int a = 0 ;}package thread.deadLock.lock1;/** * 含有main方法的类 *@author 陈浩翔 * * 2021年05月26日 */public class DeadLock1 { public static void main(String[] args) { S s = new S(); Thread b = new Thread(new ThreadB(s)); Thread a = new Thread(new ThreadA(s,b)); a.start(); b.start(); }}package thread.deadLock.lock1;/** * ThreadB类 *@author 陈浩翔 * * 2021年05月26日 */public class ThreadB implements Runnable{ private S s = null; public ThreadB(S s) { this.s = s; } @Override public void run() { System.out.println("线程B在等待锁s!"); synchronized (s) { System.out.println("线程B拿到锁s!"); s.a=100; System.out.println("线程B s.a = " + s.a); } }}package thread.deadLock.lock1;/** * ThreadA类 *@author 陈浩翔 * * 2021年05月26日 */public class ThreadA implements Runnable{ private S s = null; private Thread b = null; public ThreadA(S s,Thread b) { this.b = b; this.s = s; } @Override public void run() { System.out.println("线程A在等待锁s!"); synchronized (s) { System.out.println("线程A拿到锁s!"); try { //调用b线程的运行代码。 //但是此时的锁在a线程手里,b拿不到锁。 //所以出现了,b等待a给锁,a就拿着锁等待b运行,所以出现了死锁! b.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("s.a = " + s.a); } }}

运行结果只有一种情况,一定锁死!

第二种情况:

2)互相持有对方所需的资源(即每个线程都需要同时拿到多个资源才能继续执行,而多个线程都处于:各持有一部分,在等待另一部分。)package thread.deadLock.lock2;/** * 资源类1 *@author 陈浩翔 * * 2021年05月26日 */public class S1 { public int a =0;}package thread.deadLock.lock2;/** * 资源类2 *@author 陈浩翔 * * 2021年05月26日 */public class S2 { public int a =1;}package thread.deadLock.lock2;/** * *@author 陈浩翔 * * 2021年05月26日 */public class DeadLock2 { public static void main(String[] args) { //如果要解决这种多资源出现的死锁,可以把多个资源打包成一个综合资源, //把综合资源变成一个对象锁,哪个线程一拿到锁就有全部资源了 //在设计阶段就应该考虑到----把多线程中的每个线程所用的互斥资源图画出来 //--从图中看出哪些线程存在共享互斥资源,然后分析是否可能存在死锁 //这个死锁存在随机性!!! S1 s1 = new S1(); S2 s2 = new S2(); Thread a = new Thread(new ThreadA(s1,s2)); Thread b = new Thread(new ThreadB(s1,s2)); a.start(); b.start(); }}package thread.deadLock.lock2;/** * ThreadA---a线程运行代码类 *@author 陈浩翔 * * 2021年05月26日 */public class ThreadA implements Runnable{ private S1 s1 = null; private S2 s2 = null; public ThreadA(S1 s1, S2 s2) { this.s1 = s1; this.s2 = s2; } @Override public void run() { System.out.println("线程a在等待锁s1!"); synchronized (s1) {//拿到了锁s1 System.out.println("s1.a=" + s1.a); System.out.println("线程a拿到了锁s1"); System.out.println("线程a在等待锁s2"); synchronized (s2) {//拿到锁s2 System.out.println("线程a拿到了锁s2"); System.out.println("s2.a=" + s2.a); }//释放锁s2 System.out.println("线程a释放了锁s2"); }//释放锁s1 }}package thread.deadLock.lock2;/** * ThreadB---b线程运行代码类 *@author 陈浩翔 * * 2021年05月26日 */public class ThreadB implements Runnable{ private S1 s1 = null; private S2 s2 = null; public ThreadB(S1 s1, S2 s2) { this.s1 = s1; this.s2 = s2; } @Override public void run() { System.out.println("线程b在等待锁s2!"); synchronized (s2) {//拿到了锁s2 System.out.println("s2.a=" + s2.a); System.out.println("线程b拿到了锁s2"); System.out.println("线程b在等待锁s1"); synchronized (s1) {//拿到锁s1 System.out.println("线程b拿到了锁s1"); System.out.println("s1.a=" + s1.a); }//释放锁s1 System.out.println("线程b释放了锁s1"); }//释放锁s2 }}

这个情况下的死锁会出现2中情况::

第一种:没有死锁:

这种情况的出现是因为可能a线程或者b线程抢到了cpu资源,一次就全部运行完了,这样,就不会出现死锁!

第二种:出现了死锁:

假如a线程拿到了s1的锁,还没有拿到s2的锁,

这个时候s2的锁被b线程拿到了,b线程就开始等待s1锁,而s1锁在a线程手上,a线程就等s2锁啊,b线程就等s1锁,,,于是,出现了死锁!

大家可以看到,这个死锁的情况下,程序并没有停止运行的,那个程序运行的红方块标志还亮着呢!

前面那图没有出现死锁的情况下,程序运行一下就输出完了,红方块是暗的!

总结:

死锁的解决

(死锁并没有解决的方案,只能从源头上去避免!)

要从设计方面去解决避免,即在设计时就考虑不能出现死锁。

罗列出所有临界资源,画分布图,从图中观察其中的死锁情况,改变其中线程的(临界)资源的获取方式。

设计原则:尽量让程序中少出现临界资源。

wait/notify 和 sleep方法

wait和notify只能在它们被调用的实例的同步块内使用,而sleep()到处都可以用。

wait()和sleep()最大的区别:sleep()不释放对象锁,而wait()会释放,因此从效率方面考虑wait()方法更好。

同步设计的基本原则

◎ 同步块中(synchronized修饰)的代码越小越好!

◎ 同步块中不要写阻塞性代码(如,InputStream.read() )!

◎ 在持有锁的时候,不要对其它对象调用方法。(如果做到,可以消除最常见的死锁源头。)

同步概述

◎同步的原理:将需要同步的代码进行封装,并在该代码上加了一个锁。

◎同步的好处:解决多线程的安全问题。

◎同步的弊端:会降低性能。

◎同步的前提:必须要保证有多个线程且它们在同步中使用的是同一个锁。

Android多线程死锁定位,Java---多线程之死锁相关推荐

  1. java 多线程的基本概念_java基本教程之多线程基本概念 java多线程教程

    多线程是Java中不可避免的一个重要主体.下面我们将展开对多线程的学习.接下来的内容,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中 ...

  2. java 多线程的单例模式,Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...

  3. java 多线程写缓存,Java多线程_缓存对齐

    1.什么是缓存对齐 当前的电脑中,数据存储在磁盘上,可以断电保存,但是读取效率较低.不断电的情况下,数据可以在内存中存储,相对硬盘效率差不多是磁盘的一万倍左右.但是运算时,速度最快的是直接缓存在CPU ...

  4. 多线程java_40个Java多线程问题总结

    java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的 ...

  5. java 多线程 数据重复,java 多线程 出现数据重复调用有关问题

    java 多线程 出现数据重复调用问题 线程操作过程描述: 1.线程查询数据库表(table1)数据,并遍历修改记录状态(防止出现数据重复调用).(此操作加入了同步锁) 2.调用接口,获取返回的状态. ...

  6. java多线程模拟龟兔赛跑,JAVA多线程模拟龟兔赛跑

    JAVA多线程模拟龟兔赛跑! class Rabbit extends Thread{ Tortoise tor; int Journey; int RabbitSpeed; public Rabbi ...

  7. java1.5多线程_【Java多线程】JDK1.5并发包API杂谈

    并发与并行 并发 一个或多个处理器执行更多的任务(通过划分时间片来执行更多的任务),从逻辑上实现同时运行: 如,N个并发请求在一个两核CPU上: 并行 N个处理器分别同时执行N个任务,从物理上实现同时 ...

  8. java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题

    大概的问题是这样的: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C 要求, 同时启动三个线程, 按顺序输出ABC, 循环10次 这是一个多线程协同的问题, 本身多线程是没有执行 ...

  9. 3种java实现多线程_实现java多线程的3种方式,99%人没用过第3种

    实现多线程的3种方式 1.继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程. 继承 ...

最新文章

  1. 学习换脸:Switching Eds: Face swapping with Python, dlib, and OpenCV
  2. java反序列化 exp_java反序列化-ysoserial-调试分析总结篇(4)
  3. linux 打印函数宏,linux内核中的嵌入式汇编宏函数
  4. Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
  5. javafx隐藏_JavaFX技巧14:StackPane子项-隐藏但不消失
  6. Web后端学习笔记 Flask(13)memcached
  7. 模板设计模式_设计模式实用又简单的模板模式
  8. 蚂蚁、字节、拼多多,你的简历能通过几家?
  9. 苹果cmsV10简约白色风格自适应模板
  10. window10 安装Java11 并可以和Java8进行自由切换
  11. 全球及中国EOG放大器行业运营前景与发展动态研究报告2022版
  12. 亚马逊广告基础、打法及报表分析(一)
  13. ASP.NET项目上云实践——华为云DevCloud(图书管理系统)
  14. 深度学习——目标定位
  15. [Vue]实战---电商项目(项目的概述及初始化)【一】
  16. 【突变检验方法一】MATLAB实现Pettitt突变检验
  17. u-boot启动流程简图 --木草山人
  18. 触控科技CEO陈昊芝谈移动游戏市场趋势变化
  19. 身材要凹凸有致,感情要风清云淡
  20. 从边缘计算到人工智能 新技术加速更迭的迷茫与思考

热门文章

  1. goland 关闭 自动移除未使用的包  自动添加需要的包
  2. c++ 编译器支持情况表
  3. clamav病毒库格式解析
  4. Zend Studio 修改高亮变量的颜色、括号颜色
  5. Run-Time Check Failure #0,The value of ESP was not properly saved 错误解决
  6. 编写android服务
  7. flume数据丢失与重复_Flume架构及常见面试
  8. 浙江高校计算机等级考试二级办公,浙江省高校计算机等级考试二级(高级办公)试题12.ppt...
  9. html excel零不显,Excel数值为0不显示的三种解决方法
  10. 安装很久_快看啦!吊轨推拉门安装图解在这里。