学海无涯
死锁:
产生死锁的必备条件:
1.互斥条件
2.请求保持
3.不剥夺
4.环路等待
用自己理解来解释:
1.多个线程同时去那多把锁,并且,锁的数量小于等于线程数量
2.多个线程去拿锁的顺序是互斥的
3.拿到锁后,不释放
如何解决死锁?
从产生死锁的必备条件着手,方法一:让线程间拿锁的顺序由互斥改成一致,这样,CPU在分配时间片时,就不会产生死锁
方法二:尝试去拿锁,如果拿不到就释放已拿到的锁,使用 ReentrantLock,尝试去拿锁
public boolean tryLock() {
return sync.nonfairTryAcquire(1);
}
public boolean tryLock(long timeout, TimeUnit unit)
throws InterruptedException {
return sync.tryAcquireNanos(1, unit.toNanos(timeout));
}
拿不到锁就去释放已拿到的锁
public void unlock() {
sync.release(1);
}
那么对于方法二,不做特别处理,会产生什么情况?会发生活锁。
在循环去拿锁,拿不到,释放已拿到锁的时候,在CPU分配时间片的时候,会频繁的去拿锁,释放锁,所以在释放的锁的时候,沉睡一段随机时间数,让两个线程间在第二次以后,去拿锁的时候,错开。
死锁和活锁的区别?
死锁是多个线程间,互相等待对方释放锁,线程进入等待状态,不进行任何操作,线程无法进入运行状态。
活锁时多个线程在一直运行,一直在重复进行尝试拿锁,拿不到,释放锁,直到拿到锁,执行业务,一直在运行中。