java線程死鎖是一個經(jīng)典的問題方援,因為不同的線程都在等待根本不可能被釋放的鎖黎休,從而導致所有的任務都無法繼續(xù)完成欢揖。在多線程技術中陶耍,“死鎖”是必須避免的,因為這會造成線程的“假死”
/**
* @author wuyoushan
* @date 2017/4/25.
*/
public class DealThread implements Runnable {
public String username;
public Object lock1=new Object();
public Object lock2=new Object();
public void setFlag(String username){
this.username=username;
}
@Override
public void run() {
if (username.equals("a")){
synchronized (lock1){
try{
System.out.println("username="+username);
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (lock2){
System.out.println("按lock1->lock2代碼順序執(zhí)行了");
}
}
}
if (username.equals("b")){
synchronized (lock2){
try{
System.out.println("username="+username);
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (lock1){
System.out.println("按lock2->lock1代碼順序執(zhí)行了");
}
}
}
}
}
/**
* @author wuyoushan
* @date 2017/3/20.
*/
public class Run {
public static void main(String[] args){
try {
DealThread t1=new DealThread();
t1.setFlag("a");
Thread thread1=new Thread(t1);
thread1.start();
Thread.sleep(100);
t1.setFlag("b");
Thread thread2=new Thread(t1);
thread2.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
程序的運行結(jié)果為:
username=a
username=b
死鎖是程序設計的bug她混,在設計程序時就要避免雙方互相持有對方的鎖情況物臂。需要說明的是,本實驗使用synchronized嵌套的代碼結(jié)構來實現(xiàn)死鎖产上,其實不使用嵌套的synchronized代碼結(jié)構也會出現(xiàn)死鎖棵磷,與嵌套不嵌套無任何關系,不要被代碼結(jié)構所誤導晋涣。只要互相等待對方釋放鎖就有可能出現(xiàn)死鎖仪媒。
摘選自 java多線程核心編程技術-2.2.12