死锁的四个条件
(1)互斥条件,某一个资源在某一个时间段只能由一个线程占用,不能让两个或两个以上的线程占用
(2)不可抢占条件,线程获得资源在没有使用完毕之前,其他线程不能强行地夺走资源
(3)占有与申请条件,线程至少占有一个资源,但是又申请新的资源,由于该资源被另外的线程占有,该线程会阻塞
(4)循环等待,一个线程等待其他线程释放资源,其他的线程又在等待另外的线程释放资源,最后一个线程等待第一个线程释放资源
解决死锁
Object.wait()能使线程阻塞 同时释放资源
Object.notify()/notifyAll() 唤醒线程
死锁的预防:
(1)允许某些线程同时访问资源
(2) 允许某些线程强行夺取资源
(3)允许资源预分配策略
(4)线程进程按编号申请资源
死锁的避免:
安全序列:如果系统按照这种序列去分配资源,每个线程都能够顺序完成自己的需求,这样的序列成为安全序列