Android 线程死锁的案例

2024-09-02 20:38
文章标签 android 线程 案例 死锁

本文主要是介绍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)

解决方法:

那怎么避免死锁呢?

  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 线程死锁的案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131015

相关文章

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二: