首页 > 编程 > Java > 正文

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

2019-11-06 06:53:29
字体:
来源:转载
供稿:网友

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

例子:

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

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表