请分别介绍一下 Java 的死锁,活锁和饥饿锁。
两个或者两个以上的线程为了争夺某个资源而进行互相等待的现象。比如线程 1 拿到了 a 资源,然后需要获取 b 资源,而这个时候线程 2 获取到了 b 资源,需要需要获取 a 资源,两个线程一直占有着资源,不释放,就会一直等待。
多个线程争夺使用资源,比如线程 1 获取到了资源 a,这个时候还需要资源 b,线程 2 拿到了资源 b,还需要获取资源 a,这个时候线程 1 会释放资源 a,线程 2 会释放线程 b。这种场景下线程 1 会获取资源 b,线程 2 会获取资源 a。由于两个线程的谦让,会一直执行下去。
一个线程或者多个线程一直等待某个资源而无法获取到锁,就一直等待运行。