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");


1094

被折叠的 条评论
为什么被折叠?



