第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java中的同步如何工作

Java中的同步如何工作

拉風(fēng)的咖菲貓 2019-10-21 10:27:01
public class Deadlock {    static class Friend {        private final String name;        public Friend(String name) {            this.name = name;        }        public String getName() {            return this.name;        }        public synchronized void bow(Friend bower) {            System.out.format("%s: %s has bowed to me!%n",                     this.name, bower.getName());            bower.bowBack(this);        }        public synchronized void bowBack(Friend bower) {            System.out.format("%s: %s has bowed back to me!%n",                    this.name, bower.getName());        }    }    public static void main(String[] args) {        final Friend alphonse = new Friend("Alphonse");        final Friend gaston = new Friend("Gaston");        new Thread(new Runnable() {            public void run() { alphonse.bow(gaston); }        }).start();        new Thread(new Runnable() {            public void run() { gaston.bow(alphonse); }        }).start();    }}我沒(méi)有得到的是堵塞如何發(fā)生。main函數(shù)啟動(dòng)兩個(gè)線程,每個(gè)線程都開始各自的弓箭操作?!巴健钡降鬃柚沽耸裁??為同一對(duì)象運(yùn)行的功能相同(就像我最初想的那樣)?同一類的所有對(duì)象具有相同的功能?同一對(duì)象的所有同步功能?同一類所有對(duì)象的所有同步功能?幫幫我
查看完整描述

3 回答

?
子衿沉夜

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

在Java中,每個(gè)Object線程都提供了synchronize在其上鎖定或鎖定線程的能力。同步方法時(shí),該方法將其對(duì)象實(shí)例用作鎖。在您的示例中,方法bowbowBack都屬于synchronized,并且都位于同一類中Friend。這意味著任何執(zhí)行這些方法的線程都將在Friend實(shí)例上作為其鎖進(jìn)行同步。

一系列將導(dǎo)致死鎖的事件是:

  1. 第一個(gè)線程調(diào)用開始alphonse.bow(gaston),這是synchronized在上alphonse Friend對(duì)象。這意味著線程必須從該對(duì)象獲取鎖。

  2. 第二個(gè)線程開始通話gaston.bow(alphonse),這是synchronized在上gaston Friend對(duì)象。這意味著線程必須從該對(duì)象獲取鎖。

  3. 現(xiàn)在啟動(dòng)的第一個(gè)線程將調(diào)用bowback并等待gaston釋放鎖定。

  4. 現(xiàn)在啟動(dòng)的第二個(gè)線程將調(diào)用bowback并等待alphonse釋放鎖定。

為了更詳細(xì)地顯示事件的順序:

  1. main()開始在主要Therad中執(zhí)行(稱為線程1),創(chuàng)建兩個(gè)Friend實(shí)例。到現(xiàn)在為止還挺好。

  2. 主線程使用代碼開始其第一個(gè)新線程(稱為線程#2)new Thread(new Runnable() { ...。線程#2的呼叫alphonse.bow(gaston),這是synchronized在上alphonse Friend對(duì)象。因此,線程#2獲取alphonse對(duì)象的“鎖” 并進(jìn)入bow方法。

  3. 時(shí)間片在這里發(fā)生,原始線程有機(jī)會(huì)進(jìn)行更多處理。

  4. 主線程啟動(dòng)第二個(gè)新線程(稱為線程#3),就像第一個(gè)線程一樣。線程#3調(diào)用gaston.bow(alphonse),它在gaston Friend對(duì)象上同步。由于還沒(méi)有人獲得gaston對(duì)象實(shí)例的“鎖”,因此線程#3成功獲取了此鎖并進(jìn)入了bow方法。

  5. 一個(gè)時(shí)間片在這里發(fā)生,線程#2有機(jī)會(huì)進(jìn)行更多處理。

  6. 線#2現(xiàn)在調(diào)用bower.bowBack(this);bower正在該實(shí)例的引用gaston。這在邏輯上等效于的調(diào)用gaston.bowBack(alphonse)。因此,此方法synchronizedgaston實(shí)例上。該對(duì)象的鎖已被獲取,并由另一個(gè)線程(線程3)持有。因此,線程#2必須等待鎖定gaston被釋放。線程進(jìn)入等待狀態(tài),從而允許線程#3進(jìn)一步執(zhí)行。

  7. 現(xiàn)在bowback,線程#3進(jìn)行了調(diào)用,在這種情況下,它在邏輯上與call相同alphonse.bowBack(gaston)。為此,它需要獲取alphonse實(shí)例的鎖,但是此鎖由線程2持有?,F(xiàn)在,該線程已進(jìn)入等待狀態(tài)。

現(xiàn)在,您處于無(wú)法執(zhí)行任何線程的位置。線程#2和線程#3都在等待釋放鎖。但是,如果沒(méi)有Thread進(jìn)展,則無(wú)法釋放任何鎖定。但是,如果沒(méi)有釋放鎖,則任何線程都無(wú)法取得進(jìn)展。

因此:死鎖!

死鎖通常取決于發(fā)生的事件的特定順序,這可能使調(diào)試變得困難,因?yàn)樗鼈兛赡茈y以重現(xiàn)。


查看完整回答
反對(duì) 回復(fù) 2019-10-21
?
慕婉清6462132

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊

同步方法與將所有這些方法代碼包含在


synchronized(this) {

  /// code here ...

}

塊。


對(duì)于給定的對(duì)象實(shí)例o,一次只能有一個(gè)線程可以運(yùn)行任何synced(o)塊。嘗試運(yùn)行的所有其他線程都將失敗,直到運(yùn)行該塊(具有同步鎖)的線程退出該塊(放棄鎖)為止。


在您的情況下,死鎖發(fā)生在Alphonse開始在線程1中彎曲時(shí)進(jìn)入同步塊。然后,線程1被系統(tǒng)換出,因此線程2可以啟動(dòng)并進(jìn)行Gaston彎曲。但是Gaston還不能退縮,因?yàn)樗贏lphonse上進(jìn)行同步,并且線程1已經(jīng)具有該鎖。因此它將等待線程1離開該塊。然后,系統(tǒng)將換回線程1,這將嘗試使Alphonse退回。除非它不能這樣做,因?yàn)榫€程2在Gaston上具有同步鎖?,F(xiàn)在這兩個(gè)線程都被卡住,等待另一個(gè)線程完成彎曲,然后才能向后彎曲...


查看完整回答
反對(duì) 回復(fù) 2019-10-21
?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊

同一對(duì)象的所有同步功能。將方法標(biāo)記為“已同步”與在方法的整個(gè)內(nèi)容周圍放置“已同步(this){”塊非常相似。我之所以不說(shuō)“相同”是因?yàn)槲也恢谰幾g器是否發(fā)出相同的字節(jié)碼,但是AFAIK定義的運(yùn)行時(shí)效果是相同的。

死鎖是經(jīng)典的鎖反轉(zhuǎn)。一個(gè)線程鎖定字母。然后(或同時(shí)在多核系統(tǒng)上),另一個(gè)線程鎖定加斯頓。這部分要求線程的調(diào)度恰好在正確的位置進(jìn)行交織。

然后,每個(gè)線程(以任何順序或同時(shí))嘗試獲取另一個(gè)線程已經(jīng)持有的鎖,因此每個(gè)線程進(jìn)入睡眠狀態(tài)。雙方都不會(huì)喚醒,直到對(duì)方釋放其鎖定,但是雙方都不會(huì)釋放其鎖定,直到對(duì)方喚醒(或終止)。


查看完整回答
反對(duì) 回復(fù) 2019-10-21
  • 3 回答
  • 0 關(guān)注
  • 305 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)