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

相关文章

线程池ThreadPoolExecutor应用过程

《线程池ThreadPoolExecutor应用过程》:本文主要介绍如何使用ThreadPoolExecutor创建线程池,包括其构造方法、常用方法、参数校验以及如何选择合适的拒绝策略,文章还讨论... 目录ThreadPoolExecutor构造说明及常用方法为什么强制要求使用ThreadPoolExec

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A