過多的同步有可能出現(xiàn)死鎖,死鎖的操作一般是在程序運(yùn)行的時(shí)候才有可能出現(xiàn)
多線程中要進(jìn)行資源的共享,就需要同步,但同步過多,就可能造成死鎖
示例代碼:
此代碼中,Customer類中同步線程中調(diào)用了Waiter類的同步線程中的方法,造成了死鎖
import javax.swing.plaf.synth.SynthOptionPaneUI;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo2 {
public static void main(String[] args) {
new DeadThread();
}
}
//死鎖線程
class DeadThread implements Runnable{
Customer c = new Customer();
Waiter w = new Waiter();
public DeadThread(){
new Thread(this).start();
w.say(c);
}
@Override
public void run() {
c.say(w);
}
}
class Customer{
public synchronized void say(Waiter w){
System.out.println("顧客說:先吃飯?jiān)儋I單");
w.doService();
}
public synchronized void doService(){
System.out.println("同意了,吃完飯?jiān)儋I單");
}
}
class Waiter{
public synchronized void say(Customer c)
{
System.out.println("服務(wù)員說:先買單再吃飯");
c.doService();
}
public synchronized void doService(){
System.out.println("同意了,先吃飯?jiān)儋I單");
}
}
在IDEA編譯器中,強(qiáng)大的IDEA會(huì)解決死鎖問題,所以運(yùn)行結(jié)果正常,運(yùn)行效果:
而實(shí)際情況下,是會(huì)發(fā)生死鎖情況的,在Eclipse編譯器中的運(yùn)行效果:
