阿里妹导读本文将会剖析 Kotlin 协程死锁的根本原因, 以及如何彻底地从坑中爬出来。在 Java 中有一个非常经典的死锁问题, 就是明明自己已经占用了线程池, 却还继续去申请它, 自己等自己, 就死锁了, 如下图和代码:// 这段代码将死锁到天荒地老final ExecutorService executorService = Executors.newSingleThreadExecutor();executorService.submit(() -> { Future> subTask = executorService.submit(() -> System.out.println("Hello dead lock")); try { subTask.get(); } catch (ExecutionException | InterruptedException ignore) { }});相比别的死锁问题, 这一类问题的坑点在于, 因为线程池的实现问题, jstack 等 jvm 工具无法对其自动诊断, 只能肉眼看出。在 Kotlin 协程中, 因为底层的线程池申请更加黑盒, 如果不是足够了解, 很容易踩到这类坑。本文不会再去重复 Kotlin 协程的基本语法, 而是专注于死锁的话题。下面两段代码
………………………………