什么是线程的死锁?通俗点来说,不同线程等待对方先释放,互不释放资源,造成程序无法继续执行。
如下面一段程序:
public class TestLock {
static StringBuffer sb1=new StringBuffer();
static StringBuffer sb2=new StringBuffer();
public static void main(String[] args) {
new Thread() {
public void run() {
synchronized(sb1) {
try {
Thread.currentThread().sleep(1000);//sb1握住锁等待10s,线程暂停
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb1.append("A");
synchronized(sb2) {
sb2.append("B");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
}.start();
new Thread() {
public void run() {
synchronized(sb2) {
try {
Thread.currentThread().sleep(1000);//sb2握住锁等待10s,线程暂停
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sb1.append("C");
synchronized(sb1) {
sb2.append("D");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
}.start();
}
}
以上程序执行结果:
无任何输出,因为两个线程形成了死锁:在线程1中 sb1握住锁后停了10s,线程2中sb2也是握住锁停了10s 则他们互不放弃锁,程序没有办法往下执行,直接使线程挂掉,所以在写程序的时候,我们应当避免这种情况发生。