什么是死锁?如何避免死锁?

什么是死锁?

死锁的定义:一组互相竞争资源的线程因互相等待,导致“永久”阻塞的现象。
死锁的四个条件。
1.互斥条件。共享资源X和Y只能被一个线程享用。
2.请求和保持条件。进程T1已经取得了共享资源X,在等待共享资源Y的时候,不释放共享资源X。
3.不可抢占条件。其他进程不能抢占当前进程T1的占有的资源。
4.循环等待。线程T1等待线程T2占有的资源,线程T2等待线程T1占有的资源。

为何会产生死锁
什么是死锁?如何避免死锁?
考虑具体问题,如果账号A转账号B100元,此时账号C也找账号A

如何避免死锁?

1.破坏互斥条件,资源X和Y可以被多个线程共享。互斥有时不可行,因为加锁就是为了互斥。
2.破坏“请求和保持”条件,一次性申请所有的资源。
具体:“同时申请”这个操作是一个临界区。Java里可以使用Allocator类,同时申请资源apply()和同时释放资源free()。
3.破坏不可抢占条件,T1在申请资源的时候,如果申请不到,主动释放自己占有的资源。
具体:synchronized做不到。synchronized申请资源的时候,如果申请不到,线程直接进入阻塞状态,啥也干不了。可以通过Lock解决。
4.破坏循环等待条件,可以靠按序申请资源来预防。所有按序申请,是指资源是有序线性顺序的,申请的时候可以先申请资源序号小的,再申请资源序号大的,这样线性化后自然就不存在循环了。
具体:破坏循环等待条件,需要对资源进行排序,然后按序申请资源。我们假设每个账户都有不同的属性id,这个id可以作为排序字段,申请的时候,我们可以按照从小到大的顺序来申请。
什么是死锁?如何避免死锁?