🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
#### 死锁预防 1. **加锁顺序:**当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就会发生。然而很多时候是无法预知的。 2. **加锁时限:**加上一个超时时间,若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段时间后进行重试。但是如果有非常多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程重复的尝试但缺始终得不到锁 3. **死锁检测:**死锁检测即当一个线程获得了锁,会在线程和锁的相关数据结构中将其记下。除此之外,每当有现成请求锁,也需要记录在这个数据结构中。死锁检测是一个更好的死锁预防机制,它主要针对哪些不可能实现按序加锁并且锁超时也不可行的场景。 **线程池死锁** > f1 等待 f2,由于线程池是signle的所有 f2也会等f1 ``` final ExecutorService executorService = Executors.newSingleThreadExecutor(); Future f1 = executorService.submit(new Callable() { public Long call() throws Exception { System.out.println("start f1"); Thread.sleep(1000);//延时 Future f2 = executorService.submit(new Callable() { public Long call() throws Exception { System.out.println("start f2"); return -1L; } }); System.out.println("result" + f2.get()); System.out.println("end f1"); return -1L; } }); ```