java再复习——线程的死锁问题

来源:互联网 发布:数据库概论第五版 编辑:程序博客网 时间:2024/06/01 20:57

使用多线程的时候,除了因为操作共享数据带来的安全问题,还有一个就是因为,为了避免安全问题去使用同步,但是因为同步使用不当而产生的死锁问题。

例子:

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锁,那么程序就会堵死,执行不下去,这就是死锁。

上面的例子举的不是很好。因为死锁这问题,在编写多线程的时候规范,一般不会出现的。就算出现了,知道原因,根据原因去查哪里写的不规范就可以了。

0 0