1、问题描述
在很多互联网公司的交易系统中,会出现这种场景,【账户A】转账给【账户B】,同时【账户B】也转账给【账户A】,两个账户都需要锁住余额,所以通常会申请两把锁。转账时,先锁住自己的账户,并获取对方的锁,保证同一时刻只能由一个线程去执行转账。
这时可能就会出现,对方给我转账,同时我也给对方转账,那么双方都持有自己的锁,且尝试去获取对方的锁,这就造成可能一直申请不到对方的锁,循环等待发生“死锁”的问题!
2、什么是死锁
“死锁” 是两个或两个以上的线程在执行过程中,互相持有对方所需要的资源,导致这些线程处于等待状态,无法继续执行。若无外力作用,它们都将无法推进下去,就进入了“永久”阻塞的状态。
如上图所示:线程01获得了账户A的锁,且同时去尝试获取账户B的锁;但是,线程02已经获得了账户B的锁,所以,线程01只能等待。同样,线程02也无法获得账户A的锁(已被线程01获取),只能等待。于是,线程01和线程02都在等待对方持有的锁,且会无限期的等待下去,这就是我们所说的“死锁”了!
3、死锁代码
下面,我们来看下一个简单的会引起死锁的代码:
public class DeadLock {
public static String obj1 = "obj1";
public static String obj2 = "obj2";
public static void main(String[] args) {
Thread a