死锁
什么是死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
用代码实现一个死锁
public class DeadLock { private static final Object lock1 = new Object(); private static final Object lock2 = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (lock1) { System.out.println("获得lock1锁,尝试获得lock2"); synchronized (lock2) { System.out.println("获得lock1,lock2"); } } }).start(); new Thread(() -> { synchronized (lock2) { System.out.println("获得lock2锁,尝试获得lock1"); synchronized (lock1) { System.out.println("获得lock1,lock2"); } } } ).start(); } }
避免死锁的办法
1.避免一个线程同时获取多个锁
2.避免一个线程在锁内同时占用多个资源,尽量保证每个锁都只占用一个资源
3.尝试使用定时锁,使用Lock.tryLock(timeout),来替代使用内部锁机制
4.对于数据库锁,加锁解锁必须在一个数据库连接里,否则会出现解锁失败的情况
列举死锁的经典例子及解决办法
哲学家进餐问题
哲学家进餐的代码实现
这里在复习到操作系统时再来更博~