XML Code
* 写一个死锁示例
* 线程死锁是由于线程之间相互等待彼此释放自己锁需要的锁
* 然后相互等待导致程序僵死
* 例如A线程需要获取o1,o2两个锁,线程B需要o2,o1两个锁
* 当线程A拥有o1的锁,则它要执行完就需要获取o2锁,此时o2锁的拥有者是B
* 线程A等待线程B释放o2锁,同时线程B也在等待线程A释放o1锁,所以两个线程相互等待对方释放自己需要的锁
* 就这样他们天长地久的等待着彼此
package com.lyzx.concurrent.se;
import java.util.concurrent.TimeUnit;
public class T1 {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
new Thread(new XMan(o1,o2),"A").start();
new Thread(new XMan(o2,o1),"B").start();
new Thread(new YMan(),"Yman-01").start();
System.out.println("main....end....");
}
}
class XMan implements Runnable{
private final Object o1;
private final Object o2;
public XMan(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
@Override
public void run() {
synchronized (o1){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println(Thread.currentThread().getName()+"==>ok");
}
}
}
}
class YMan implements Runnable{
@Override
public void run() {
for(int i=0;i<1000;i++){
try{TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e){}
System.out.println(Thread.currentThread().getName()+" is running "+i);
}
}
}
通过Java自带的工具Jconsole,可以查看线程状况
点击下面的检测死锁,可以看到导致死锁的线程,如下图
可以看到是A和B导致了线程死锁,所以看到这个图,大家应该明白给线程起名字真的很重要啊!