在Java(以及任何并发编程环境)中,产生死锁必须同时满足以下四个必要条件。这四个条件被称为 Coffman 条件,只要打破其中任何一个,就可以避免死锁的发生: 1. 互斥条件 (Mutual Exclusion) 含义:资源在同一时刻只能被一个线程占用。如果其他线程想要获取该资源,就必须等待,直到占有该资源的线程释放。 Java中的体现:使用 关键字或者 获取的排他锁。同一时间只能有一个线程持有该锁。 2. 请求与保持条件 (Hold and Wait / 占有并等待) 含义:一个线程已经持有了一个(或多个)资源,但又提出了新的资源请求,而新请求的资源正被其他线程占用。此时该线程被阻塞,但对自己已经获得的资源保持不放。 Java中的体现:线程 A 已经进入了 代码块,在没有退出(即没有释放 lock1)的情况下,又试图进入 代码块,但 lock2 此时被别的线程持有。 3. 不剥夺条件 (No Preemption / 非抢占) 含义:线程已经获得的资源在未使用完之前,不能被其他线程强行剥夺(抢占),只能由持有该资源的线程主动释放。 Java中的体现:在Java中,无论是内部锁...