模拟java 线程死锁

        ExecutorService executorService = Executors.newFixedThreadPool(2);Object lockA =new Object();Object lockB =new Object();executorService.submit(new Runnable() {@Overridepublic void run() {synchronized (lockA){try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lockB){Log.d(TAG, "aaa");}}}});executorService.submit(new Runnable() {@Overridepublic void run() {synchronized (lockB){synchronized (lockA){Log.d(TAG, "bbb");}}}});

我们启动了一个线程A 在里面先拿到LockA 这把锁,然后睡眠2S.
在线程B 里面先拿到LockB 这把锁,然后去拿线程A 的锁。
线程A睡醒之后,去拿B的锁,这时候就会发生死锁。

我们看下dump 出来的线程信息:

线程A

"pool-3-thread-1@12151" prio=5 tid=0x99 nid=NA waiting for monitor entryjava.lang.Thread.State: BLOCKEDblocks pool-3-thread-2@12152waiting for pool-3-thread-2@12152 to release lock on <0x2f7e> (a java.lang.Object)at com.example.fragment.ConcurrentFragment$10.run(ConcurrentFragment.java:180)- locked <0x2f7d> (a java.lang.Object)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)at java.lang.Thread.run(Thread.java:914)

线程B

"pool-3-thread-2@12152" prio=5 tid=0x9a nid=NA waiting for monitor entryjava.lang.Thread.State: BLOCKEDblocks pool-3-thread-1@12151waiting for pool-3-thread-1@12151 to release lock on <0x2f7d> (a java.lang.Object)at com.example.fragment.ConcurrentFragment$11.run(ConcurrentFragment.java:192)- locked <0x2f7e> (a java.lang.Object)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:462)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)at java.lang.Thread.run(Thread.java:914)

解决方法:

那怎么避免死锁呢?

  1. 争取一个业务不使用两个以上的锁,只有一个锁,不会发生死锁。
  2. 使用Lock 接口锁,使用超时锁,或者尝试获取锁
  3. 使用可重入锁
    /**** <p>An implementation can favor responding to an interrupt over normal* method return, or reporting a timeout.** <p>A {@code Lock} implementation may be able to detect* erroneous use of the lock, such as an invocation that would cause* deadlock, and may throw an (unchecked) exception in such circumstances.* The circumstances and the exception type must be documented by that* {@code Lock} implementation.** @param time the maximum time to wait for the lock* @param unit the time unit of the {@code time} argument* @return {@code true} if the lock was acquired and {@code false}*         if the waiting time elapsed before the lock was acquired** @throws InterruptedException if the current thread is interrupted*         while acquiring the lock (and interruption of lock*         acquisition is supported)*/boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

Android 线程死锁的案例相关推荐

  1. 《手Q Android线程死锁监控与自动化分析实践》

    一.问题背景 手Q每个版本上线以后研发同学都会收到各种问题反馈.在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下: 1.问题表象:"未读不消失"."图片不展 ...

  2. Android 线程死锁导致的ANR问题分析

    最近遇到一个系统引起的ANR问题,遇到的时候特别懵,首先我取出了日志文件,由于网上分析ANR的例子比较少,无法找到参考,所以只能硬上了 在/data/anr/目录下的trace文件 ANR文件 下面是 ...

  3. JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池...

    /*** 多线程共享数据* 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行.* 多线程共享数据的安全问题,使用同步解决.* 线程同步两种方法: ...

  4. java线程死锁_Java线程死锁–案例研究

    java线程死锁 本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括 ...

  5. Log4j线程死锁–案例研究

    此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案. 它还将说明在开发和支持Java EE应用程序时适当的Java类 ...

  6. Java线程死锁–案例研究

    本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括用于IBM JVM ...

  7. 线程死锁问题以及简单案例分析

    线程死锁问题以及简单案例分析 1. 什么是死锁? 1.1 概述 1.2. 业务场景--举例说明 2. 死锁例子 2.1 代码 2.2 效果 2.3 代码分析 3. 解决案例中死锁问题 4. 怎么避免线 ...

  8. Android/Linux线程死锁demo分析

    1.线程死锁 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <un ...

  9. Android线程池封装库

    目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...

最新文章

  1. java stringbuilder 替换字符串_java中的经典问题StringBuilder替换String
  2. kcf跟踪算法实例整理
  3. 数据科学与python语言实验——NumPy数值计算基础
  4. 深入理解MySQL底层架构,看这一篇文章就够了!
  5. 信息学奥赛一本通(1258:【例9.2】数字金字塔)
  6. java 类里面对象共享_Java并发编程 - 对象的共享
  7. [Microsoft][ODBC SQL Server Driver][SQL Server]String or binary data would be truncated.
  8. Linux汇编调试器EDB
  9. Linux部署DotNetCore记录
  10. 峰值,峰峰值,有效值的基本知识
  11. 使用pyspider爬取巨量淘宝MM图片 1
  12. 版本控制系统(vcs)Git
  13. 读书笔记------《平凡的世界》
  14. C语言中快排函数——qsort()
  15. vs的快捷键——注释/取消注释
  16. JAVA#内部类'学习札记
  17. 为啥在VS中使用scanf函数会有警告呢?如何解决此问题?(如何添加#define _CRT_SECURE_NO_WARNINGS 1)
  18. [PCL教程]PCL漫游之Registration,Visualization
  19. PhotoShop常用的快捷键及 瘦身
  20. 高考志愿填报网站服务器,高考后填报志愿必须遵守的原则

热门文章

  1. android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
  2. java递归url目录_Java递归实现某个目录下所有文件和目录
  3. 设计聊天机器人技术栈的终极攻略
  4. MVP模式在Android实际项目中的应用和优化
  5. OARCLE11G的密码管理
  6. Ajax——从服务器获取各种文件
  7. ATL CLR MFC Win32 常规 的区别
  8. Vim编程之:tags,cscope,taglist
  9. 浅说Java中的反射机制(一)
  10. 《微型计算机2014年》更新至12月下