SynchronousQueue

往鏈表尾部放節點,put和offer的節點裏元素是有內容的(有沒有內容是看isData屬性),take和poll的節點裏元素是null。放進去就開始掛起(根據傳入參數判斷你是不掛起直接返回,仍是掛起直到喚醒,仍是掛起固定的時間以後本身喚醒)。併發

放節點的時候會判斷:跟前一個節點的isData是否相同,若是相同(這裏有前一個節點是頭結點的狀況),new一個放後面。若是不一樣,好比本身是取,說明前一個是放,並在掛起等待別人取。那麼取走,元素置空,喚醒掛起的,掛起線程被喚醒以後發現本身的元素已經被置空說明已經被取走,完成放置任務,退出。反之,本身是放,一個道理。線程

整個過程當中,由於是個單鏈表,併發衝突有兩點:頭結點和尾節點的後移和節點元素的置換,這兩點在for循環中用cas是能夠作到的。for循環

相關文章
相關標籤/搜索