死锁
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力作用,它们都将无法推进下去。
原因:两个或两个以上的线程共同访问两个或多个相同的资源(如对象锁),并且每个线程都持有部分资源同时等待其他线程释放它所需要的资源,从而导致所有线程都无法继续执行。
public class DeadLock {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
new Thread(() -> {
while (true) {
synchronized (lock1) {
System.out.println("t1线程获得lock1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("t1线程获得lock2");
}
}
}
}, "t1").start();
new Thread(() -> {
synchronized (lock2) {
System.out.println("t2线程获得lock2");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock1) {
System.out.println("t2线程获得lock1");
}
}
}, "t2").start();
}
}
活锁
理论角度,活锁是存在的,但是实际上,几乎不会出现,或者说永久的活锁下去(意思就是说,有可能出现一段时间的活锁,但是过了一段时间后又没有了)
线程A拿到14之后,尝试去拿13,拿不到的话,连14都放了
线程B拿到13之后,尝试去拿14,拿不到的话,连13都放了
那么就可能出现这种情况
总结就是,总是同时拿锁,同时放,同时拿,同时放,没有一个时间差,就出现了活锁
线程饥饿
定义:线程饥饿是指一个或多个线程因为无法获得所需的资源而长时间无法执行的现象。
原因:线程饥饿通常是由于资源分配不公或优先级设置不当导致的。例如,在高优先级线程持续占用CPU资源的情况下,低优先级线程可能无法得到执行的机会;或者,在某些情况下,某些线程可能因为无法获得所需的锁或其他资源而长时间等待。