1、死锁
有这样的情况:多个线程占有资源同时抢占资源时,互相等待,产生死锁;
例如: t1 线程 获得 A对象 锁,接下来想获取 B对象 的锁 t2 线程 获得 B对象 锁,接下来想获取 A对象 的锁
Object A = new Object();
Object B = new Object();
Thread t1 = new Thread(() -> {
synchronized (A) {
log.info("lock A");
sleep(1);
synchronized (B) {
log.info("lock B");
log.info("操作...");
}
}
}, "t1");
Thread t2 = new Thread(() -> {
synchronized (B) {
log.info("lock B");
sleep(0.5);
synchronized (A) {
log.info("lock A");
log.info("操作...");
}
}
}, "t2");
t1.start();
t2.start();
2、活锁
活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如:
static volatile int count = 10;
public static void main(String[] args) {
new Thread(() -> {
// 期望减到 0 退出循环
while (count > 0) {
sleep(2);
count--;
log.info("count: {}", count);
}
}, "t1").start();
new Thread(() -> {
// 期望超过 20 退出循环
while (count < 20) {
sleep(2);
count++;
log.info("count: {}", count);
}
}, "t2").start();
}
- 饥饿
一个线程由于优先级太低,始终得不到 CPU 调度执行,也不能够结束;