在多线程中使用synchronized()的时候一定要注意 有可能出现死锁。死锁一般是
synchronized()里面再嵌套了一个锁,并且这两个synchronized()用的不是同一个锁。
例如:
if(true){
synchronized(锁a){
synchronized(锁b){
}
}
}else{
synchronized(锁b){
synchronized(锁a){
}
}
因为每一个synchronized()的锁所对应的“钥匙”只有一把所以当 第一个线程已经拿到a锁又想将if里面的内容运行完就必须拿到b锁。可惜的是另一个线程恰好拿到了b锁又想去拿a锁运行else里面的内容。这样 两个线程分别独立拿到了不同的锁确又想要对方手里的锁去运行程序-----这时就出现了死锁了。
因此,用同步的时候要特别小心以防止死锁的出现。 |