线程的活跃性有 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(); }
}
|
两个线程争相创造条件。
饥饿
其中一个线程一直处于非运行状态。