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

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

當(dāng)Java LinkedBlocking Queue只有一個(gè)元素時(shí),如果同時(shí)放置和取出會(huì)發(fā)生什么?

當(dāng)Java LinkedBlocking Queue只有一個(gè)元素時(shí),如果同時(shí)放置和取出會(huì)發(fā)生什么?

繁華開(kāi)滿天機(jī) 2019-04-04 22:15:48
LinkedBlocking Queue有兩個(gè)鎖,一個(gè)用于put,一個(gè)用于take。當(dāng)隊(duì)列的大小為1時(shí),我認(rèn)為兩個(gè)線程可以同時(shí)鎖定和操作隊(duì)列,這將導(dǎo)致未定義的行為。我錯(cuò)了嗎?// method put:                             // method take:             // put lock                                 // take lock  putLocK.lockInterruptibly();              takeLock.lockInterruptibly();                        ...                                       ...  while(count.get() == capacity){           while(count.get() == 0){    notFull.await();                          notEmpty.await();  }                                         }  enqueue(node);                            x = dequeue();// method enqueue:                           // method dequeue:   last = last.next = node;                 Node<E> h = head;      ...                                       Node<E> first = h.next;                                            h.next = h;                                                    head = first;                                                 E x = first.item;                                                 first.item = null;                                               return x;當(dāng)隊(duì)列中只有一個(gè)項(xiàng)目時(shí),顯然可以將線程和線程鎖定,因此它們將分別在方法入隊(duì)和出隊(duì)中執(zhí)行代碼。我的意思是如果線程進(jìn)入方法出列,在所有指針修改后,不會(huì)與enqueue中的代碼沖突?這里的鏈接說(shuō)“但是當(dāng)隊(duì)列為空時(shí),無(wú)法避免爭(zhēng)用,因此需要額外的代碼來(lái)處理這種常見(jiàn)的”邊緣“情況”在Java中,BlockingQueue是否完全是線程安全的
查看完整描述

3 回答

?
慕碼人2483693

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

BlockingQueue 的javadoc(LinkedBlockingQueue的超類)聲明:

BlockingQueue實(shí)現(xiàn)是線程安全的。所有排隊(duì)方法都使用內(nèi)部鎖或其他形式的并發(fā)控制以原子方式實(shí)現(xiàn)其效果。

“原子地”一詞意味著如果兩個(gè)操作(例如a put和a take)同時(shí)發(fā)生,那么實(shí)現(xiàn)將確保它們根據(jù)合同行為。效果會(huì)仿佛put之前發(fā)生get,反之亦然。這也適用于邊緣情況,例如具有一個(gè)元素的隊(duì)列示例。

實(shí)際上,由于put并且get正在阻塞操作,因此兩個(gè)操作的相對(duì)順序無(wú)關(guān)緊要。與offerpolladdremove順序的事,但你無(wú)法控制它。


請(qǐng)注意,上述內(nèi)容完全基于javadoc所說(shuō)的內(nèi)容。假設(shè)我已正確解釋了javadoc,那么它適用于所有1個(gè) BlockingQueue實(shí)現(xiàn),無(wú)論它們是使用一個(gè)還是兩個(gè)鎖......或者根本不使用。如果BlockingQueue實(shí)現(xiàn)不像上面那樣,那就是一個(gè)錯(cuò)誤!

1 - 正確實(shí)現(xiàn)API的所有實(shí)現(xiàn)。這應(yīng)該涵蓋所有Java SE類。


查看完整回答
反對(duì) 回復(fù) 2019-05-15
?
慕絲7291255

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

put 實(shí)施一個(gè) LinkedBlockingQueue

public void put(E e) throws InterruptedException {
    // some lock and node code

    // the part that matters here
    try {

        while (count.get() == capacity) {
            notFull.await();
        }

        // put the item in the queue.
    } finally {
        // not important here
    }}

基本上,在put調(diào)用線程wait中,容量小于最大持續(xù)時(shí)間。

即使將值放在隊(duì)列上的線程抓取與take線程不同的鎖,它也會(huì)等待將其添加到隊(duì)列中,直到隊(duì)列未滿。

take有一個(gè)類似的實(shí)現(xiàn),notEmpty而不是notFull。

分享編輯


查看完整回答
反對(duì) 回復(fù) 2019-05-15
?
慕哥6287543

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


經(jīng)過(guò)2天的搜索,我終于明白了...當(dāng)隊(duì)列中只有一個(gè)項(xiàng)目時(shí),根據(jù)LinkedBlocking Queue的設(shè)計(jì),實(shí)際上有兩個(gè)節(jié)點(diǎn):虛擬頭和真實(shí)項(xiàng)目(同時(shí)最后指向它)。確實(shí),put thread和take thread都可以獲得鎖定,但是它們會(huì)修改隊(duì)列的不同部分。


Put線程會(huì)調(diào)用


last = last.next = node; // last points to the only item in queue

拿線程會(huì)打電話


Node<E> h = head;

Node<E> first = h.next;  // first also points to the only item in queue

h.next = h; 

head = first;

E x = first.item;

first.item = null;

return x;

這兩個(gè)線程的交集是最后指向put線程以及在線程中首先指向的線程。請(qǐng)注意,put thread僅修改last.item并且take thread僅修改first.next。雖然這兩個(gè)線程修改了同一個(gè)對(duì)象實(shí)例,但它們會(huì)修改它的不同成員,并且不會(huì)導(dǎo)致任何線程沖突。


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

添加回答

舉報(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)