使用多线程的时候,除了因为操作共享数据带来的安全问题,还有一个就是因为,为了避免安全问题去使用同步,但是因为同步使用不当而产生的死锁问题。
例子:
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锁,那么程序就会堵死,执行不下去,这就是死锁。
上面的例子举的不是很好。因为死锁这问题,在编写多线程的时候规范,一般不会出现的。就算出现了,知道原因,根据原因去查哪里写的不规范就可以了。
新闻热点
疑难解答