使用多线程的时候,除了因为操作共享数据带来的安全问题,还有一个就是因为,为了避免安全问题去使用同步,但是因为同步使用不当而产生的死锁问题。
例子:
public class DeadLockDemo {
public static void main(String[] args) {
Data data = new Data();
new Thread(new RunnableA(data)).start();
new Thread(new RunnableB(data)).start();
}
}
class RunnableA implements Runnable{
Data data;
public RunnableA(Data data){
this.data = data;
}
public void run() {
synchronized(this){
System.out.println(data.i--);
synchronized(data){
System.out.println(data.i--);
}
}
}
}
class RunnableB implements Runnable{
Data data;
public RunnableB(Data data){
this.data = data;
}
public void run() {
synchronized(this){
System.out.println(data.i--);
synchronized(data){
System.out.println(data.i--);
}
}
}
}
class Data {
public int i = 100;
}
同步代码块的嵌套。同步代码块互相嵌套会发生互相所要锁的问题,如果一个线程拿到了A锁等B锁,另一个线程拿到了B锁等A锁,那么程序就会堵死,执行不下去,这就是死锁。
上面的例子举的不是很好。因为死锁这问题,在编写多线程的时候规范,一般不会出现的。就算出现了,知道原因,根据原因去查哪里写的不规范就可以了。