28.JAVA編程之線程死鎖

過多的同步有可能出現(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)行效果:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容