死锁
有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁
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
| Object A = new Object(); Object B = new Object(); Thread t1 = new Thread(() -> { synchronized(A) { log.debug("lock A"); sleep(1); synchronized(B) { log.debug("lock B"); log.debug("操作..."); } } }, "t1");
Thread t2 = new Thread(() -> { synchronized(B) { log.debug("lock B"); sleep(0.5); synchronized(A) { log.debug("lock A"); log.debug("操作..."); } } }, "t2"); t1.start(); t2.start();
|
输出:
1 2
| 12:22:06.962 [t2] c.TestDeadLock - lock B 12:22:06.962 [t1] c.TestDeadLock - lock A
|
活锁
活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class TestLiveLock { static volatile int count = 10; static final Object lock = new Object();
public static void main(String[] args) { new Thread(() -> { while (count > 0) { sleep(0.2); count--; log.debug("count: {}", count); } }, "t1").start(); new Thread(() -> { while (count < 20) { sleep(0.2); count++; log.debug("count: {}", count); } }, "t2").start(); } }
|
参考