多线程中死锁出现的原因及出现后的现象
- 对以下代码出现死锁的分析:
如果线程先拿到s1这个监视器,则其运行到sleep()处,出现了阻塞;
在这个线程阻塞的过程中,另一个线程也有可能执行,则其拿到s2,同理,
其运行到sleep()处,也出现了阻塞,当两个线程都“醒”的时候,一个线程
拿着s1不放,另一个线程拿着s2不放。导致想要s1的线程拿不到s1,想要s2
的线程拿不到s2,两个线程僵持下去,谁也得不到自己想要的资源,最终便
形成了死锁
package com.anquan.bean;
/*
* 多线程的死锁问题
*
* (1)原因:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的资源,
* 就形成了线程中的死锁
* Eg:两个人都喜欢着对方,可是谁都没有先开口表达,都在等待对方先说,
* 便僵持着,最后就错过了
* (2)现象:出现死锁后,不会出现异常,也没有提示,而是所有的线程都处于阻塞状态,无法继续执行
*
*
* 对以下代码出现死锁的分析:
*
* 如果线程先拿到s1这个监视器,则其运行到sleep()处,出现了阻塞;
* 在这个线程阻塞的过程中,另一个线程也有可能执行,则其拿到s2,同理,
* 其运行到sleep()处,也出现了阻塞,当两个线程都“醒”的时候,一个线程
* 拿着s1不放,另一个线程拿着s2不放。导致想要s1的线程拿不到s1,想要s2
* 的线程拿不到s2,两个线程僵持下去,谁也得不到自己想要的资源,最终便
* 形成了死锁
*
* */
public class DeadLock {
public static void main(String[] args) {
StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
new Thread(){
public void run(){
synchronized(s1){
s1.append("a");
s2.append(1);
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(s2){
s1.append("b");
s2.append(2);
}
System.out.println(s1);
System.out.println(s2);
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized(s2){
s1.append("c");
s2.append(3);
}
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(s1){
s1.append("d");
s2.append(4);
}
System.out.println(s1);
System.out.println(s2);
}
}).start();
}
}