线程死锁产生的必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
如何避免死锁,这点我觉得Erlang模型值得参考。在编程过程中,有一些避免死锁的经验:
(1) 等待某个资源时,使用超时机制(例如Erlang中的receive可以加一个超时);
(2) 采用消息通信的通信机制,而不是共享内存的通信机制(例如Erlang中进程和进程之间一般可以通过发送消息来通信)。