死锁
死锁:当第一个线程拥有对象A锁标记,等待对象B锁标记,同时第二个线程拥有对象B锁标记,并等待对象A锁标记时,产生死锁。
一个线程可以同时拥有多个对象的锁标记,当线程阻塞时,不会释放已拥有的锁标记,由此可能造成死锁。
代码示例:
//定义A、B两把锁 private static Object lockA = new Object(); private static Object lockB = new Object(); public static void main(String[] args) { Thread t1 = new Thread(() -> { //t1先拿到A锁,然后等待B锁 synchronized (lockA) { System.out.println("t1获取到锁lockA"); synchronized (lockB) { System.out.println("t1获取到锁lockB"); } } }); Thread t2 = new Thread(() -> { //t2先拿到B锁,然后等待A锁 synchronized (lockB) { System.out.println("t2获取到锁lockB"); synchronized (lockA) { System.out.println("t2获取到锁lockA"); } } }); //启动线程 t1.start(); t2.start(); }
结果:
t1获取到锁lockA
t2获取到锁lockB
这时我们会发现t1拿到了A锁,现在在等B锁;但是B锁被t2拿到了,t2又在等A锁,所以就出现了死锁。
解决方法:我们可以延迟启动线程t2,这样就解决了死锁问题。
//启动线程 t1.start(); Thread.sleep(100);//通过休眠100毫秒,保证t1可以拿到A、B锁 t2.start();
输出结果:
t1获取到锁lockA
t1获取到锁lockB
t2获取到锁lockB
t2获取到锁lockA

浙公网安备 33010602011771号