死锁就是有一天你回家,拿着一把钥匙使劲往锁眼里面捅,结果钥匙断里面了,所以你就叫开锁师傅要开锁,结果锁给开死了,这就是死锁了。以上仅仅是玩笑话,以下步入正题。
什么是死锁?
要了解什么是死锁,要首先明白一点,锁是用来做什么?Java中的锁说白了,就是为了保证资源安全,确保一次仅有一个线程对共享资源进行修改。(以上仅为个人理解,如有问题,请评论讨论。)那死锁的概念就好理解了,就是有两个及以上的线程对同一个资源进行争夺,结果两个线程没有一个让步,并且没有任何的外力进行协调导致的一种僵局。
例1:马路上就只有一条道,刚好两辆车都到了,两司机开始吵架说,是我先到的,没有一个让的,而刚好这条路上没有交通警察来协调,于是两司机就吵的不可开交。当然这个例子有失偏颇,但是可以作为一个入门的理解。
例2: 线程中出现的死锁就是:
线程A -> 锁a资源 -> 锁b资源
线程B -> 锁b资源 -> 锁a资源
结果两个线程同时开启了,导致了A线程拿到a资源不放又同时去请求b资源,而B线程拿到b资源不放同时又去请求b资源。
以上两个例子对应了线程产生死锁的两种原因。
死锁产生的原因
两种原因:
1.竞争资源不可剥夺资源
2.进程推进顺序冲突
刚好有点类似以上的两个例子,读者可以回顾查看一下。