1. 使用不当:竞争与死锁
synchronized
保证了同一时刻只有一个线程访问同步块,但过度使用会导致线程争用、性能瓶颈,甚至死锁。当多个线程在不同顺序上请求多个锁时,容易产生循环等待而死锁。
下面示例演示了两个线程互相持有对方需要的锁导致的死锁情况:
Object lockA = new Object(), lockB = new Object();
new Thread(() -> {synchronized(lockA) {System.out.println("线程1持有lockA,尝试获取lockB");try { Thread.sleep(50); } catch(Exception e) {}synchronized(lockB) {System.out.println("线程1获取到lockB");}}
}, "T1").start();new Thread(() -> {synchronized(lockB) {System.out.println("线程2持有lockB,尝试获取lockA");try {