Java面试题

题目

请分别介绍一下 Java 的死锁,活锁和饥饿锁。

答案

死锁详解

定义

两个或者两个以上的线程为了争夺某个资源而进行互相等待的现象。比如线程 1 拿到了 a 资源,然后需要获取 b 资源,而这个时候线程 2 获取到了 b 资源,需要需要获取 a 资源,两个线程一直占有着资源,不释放,就会一直等待。

产生条件

  1. 互斥条件:在某一个时间线程必须独占某个资源。
  2. 请求与保持条件:一个进程获取到某个资源的时候,如果自己不执行完不会释放已获取资源,别人也不能强制剥夺。
  3. 循环等待:若干个线程之间获取的资源形成了一种首尾相接的关系。

活锁详解

定义

多个线程争夺使用资源,比如线程 1 获取到了资源 a,这个时候还需要资源 b,线程 2 拿到了资源 b,还需要获取资源 a,这个时候线程 1 会释放资源 a,线程 2 会释放线程 b。这种场景下线程 1 会获取资源 b,线程 2 会获取资源 a。由于两个线程的谦让,会一直执行下去。

饥饿锁详解

定义

一个线程或者多个线程一直等待某个资源而无法获取到锁,就一直等待运行。

产生条件

  1. 高优先级的线程始终占用了低优先级线程的 cpu 时间。
  2. 线程被永久阻塞在了一个等待进入同步块状态,被调用了 wait 方法,没有被唤醒。