0%

java | 活跃性

线程的活跃性有 3 种情况

  • 死锁
  • 活锁
  • 饥饿

死锁

一个线程需要同时获得多把锁,这样就容易发生死锁了。

  • t1 线程获得 A 对象的锁,接下来想获取 B 对象的锁
  • t2 线程获得 B 对象的锁,接下来想获取 A 对象的锁

活锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.redisc;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.Run")
public class Run {

static volatile int count = 10;

public static void main(String[] args) throws Exception {
new Thread(() -> {
while (count > 0) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
count--;
log.debug("count {}", count);
}
}).start();

new Thread(() -> {
while (count < 20) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
log.debug("count {}", count);
}
}).start();
}

}

两个线程争相创造条件。

饥饿

其中一个线程一直处于非运行状态。

请我喝杯咖啡吧~