Android 线程死锁的案例
模拟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)
解决方法:
那怎么避免死锁呢?
- 争取一个业务不使用两个以上的锁,只有一个锁,不会发生死锁。
- 使用Lock 接口锁,使用超时锁,或者尝试获取锁
- 使用可重入锁
/**** <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 线程死锁的案例相关推荐
- 《手Q Android线程死锁监控与自动化分析实践》
一.问题背景 手Q每个版本上线以后研发同学都会收到各种问题反馈.在跟进手Q内部用户反馈的问题时,发现多例问题,其表象和原因如下: 1.问题表象:"未读不消失"."图片不展 ...
- Android 线程死锁导致的ANR问题分析
最近遇到一个系统引起的ANR问题,遇到的时候特别懵,首先我取出了日志文件,由于网上分析ANR的例子比较少,无法找到参考,所以只能硬上了 在/data/anr/目录下的trace文件 ANR文件 下面是 ...
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池...
/*** 多线程共享数据* 线程同步:多个线程在同一个时间段只能有一个线程执行其指定代码,其他线程要等待此线程完成之后才可以继续执行.* 多线程共享数据的安全问题,使用同步解决.* 线程同步两种方法: ...
- java线程死锁_Java线程死锁–案例研究
java线程死锁 本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括 ...
- Log4j线程死锁–案例研究
此案例研究描述了影响Weblogic Portal 10.0生产环境的Apache Log4j线程争用问题的完整根本原因分析和解决方案. 它还将说明在开发和支持Java EE应用程序时适当的Java类 ...
- Java线程死锁–案例研究
本文将描述从在IBM JVM 1.6上运行的Weblogic 11g生产系统中观察到的最新Java死锁问题的完整根本原因分析. 此案例研究还将证明掌握线程转储分析技能的重要性: 包括用于IBM JVM ...
- 线程死锁问题以及简单案例分析
线程死锁问题以及简单案例分析 1. 什么是死锁? 1.1 概述 1.2. 业务场景--举例说明 2. 死锁例子 2.1 代码 2.2 效果 2.3 代码分析 3. 解决案例中死锁问题 4. 怎么避免线 ...
- Android/Linux线程死锁demo分析
1.线程死锁 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <un ...
- Android线程池封装库
目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...
最新文章
- java stringbuilder 替换字符串_java中的经典问题StringBuilder替换String
- kcf跟踪算法实例整理
- 数据科学与python语言实验——NumPy数值计算基础
- 深入理解MySQL底层架构,看这一篇文章就够了!
- 信息学奥赛一本通(1258:【例9.2】数字金字塔)
- java 类里面对象共享_Java并发编程 - 对象的共享
- [Microsoft][ODBC SQL Server Driver][SQL Server]String or binary data would be truncated.
- Linux汇编调试器EDB
- Linux部署DotNetCore记录
- 峰值,峰峰值,有效值的基本知识
- 使用pyspider爬取巨量淘宝MM图片 1
- 版本控制系统(vcs)Git
- 读书笔记------《平凡的世界》
- C语言中快排函数——qsort()
- vs的快捷键——注释/取消注释
- JAVA#内部类'学习札记
- 为啥在VS中使用scanf函数会有警告呢?如何解决此问题?(如何添加#define _CRT_SECURE_NO_WARNINGS 1)
- [PCL教程]PCL漫游之Registration,Visualization
- PhotoShop常用的快捷键及 瘦身
- 高考志愿填报网站服务器,高考后填报志愿必须遵守的原则
热门文章
- android 网络加载图片点击大图后 浏览 可 缩放,Android 网络加载图片点击大图后 浏览 可 缩放...
- java递归url目录_Java递归实现某个目录下所有文件和目录
- 设计聊天机器人技术栈的终极攻略
- MVP模式在Android实际项目中的应用和优化
- OARCLE11G的密码管理
- Ajax——从服务器获取各种文件
- ATL CLR MFC Win32 常规 的区别
- Vim编程之:tags,cscope,taglist
- 浅说Java中的反射机制(一)
- 《微型计算机2014年》更新至12月下