真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java的SynchronousQueue是什么

這篇文章主要講解了“java的SynchronousQueue是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“java的SynchronousQueue是什么”吧!

成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),網(wǎng)站設(shè)計(jì),綿陽服務(wù)器托管等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競爭對手中脫穎而出成都創(chuàng)新互聯(lián)公司。

功能說明

要理解SynchronousQueue首先就是要知道它的作用,只有知道這個(gè)類存在的目的和提供的功能,再能再讀源碼的時(shí)候不迷路。

我們在之前的學(xué)習(xí)中,如果線程間要交換數(shù)據(jù)一般都是用一個(gè)通過公共變量或者一個(gè)同步阻塞隊(duì)列,生產(chǎn)者線程設(shè)置變量或者往隊(duì)列中put值,消費(fèi)者線程則讀取變量或者從隊(duì)列中take

而SynchronousQueue則不需要存儲(chǔ)線程間交換的數(shù)據(jù),它的作用更像是一個(gè)匹配器,使生產(chǎn)者和消費(fèi)者一一匹配。

一般流程

比如當(dāng)一個(gè)線程調(diào)用了put方法時(shí),發(fā)現(xiàn)隊(duì)列中沒有take線程,那么put線程就會(huì)阻塞,當(dāng)take線程進(jìn)來時(shí)發(fā)現(xiàn)有阻塞的put線程,那么他們兩個(gè)就會(huì)匹配上,然后take線程獲取到put線程的數(shù)據(jù),兩個(gè)線程都不阻塞。

反之一個(gè)線程調(diào)用take方法也會(huì)阻塞線程,當(dāng)一個(gè)調(diào)用put方法的線程進(jìn)來后也會(huì)與之匹配。 

如果一個(gè)take或者put線程進(jìn)來發(fā)現(xiàn)有同類的take或者put線程在阻塞中,那么線程會(huì)排到后面,直到有不同類的線程進(jìn)來然后匹配其中一個(gè)線程。 

通過流程描述相信對SynchronousQueue有了一定的了解,也知道SynchronousQueue為什么不用存儲(chǔ)元素。

源碼分析

通過查看SynchronousQueue的take與put方法發(fā)現(xiàn)都是調(diào)用的一個(gè)屬性transferer的transfer方法,而transferer屬性是SynchronousQueue的抽象靜態(tài)內(nèi)部類Transferer。Transferer有兩個(gè)子類TransferQueue和TransferStack;

在SynchronousQueue構(gòu)造方法中通過傳遞的參數(shù)fair來判斷是創(chuàng)建TransferQueue還是TransferStack,通過參數(shù)fair來看TransferQueue應(yīng)該是公平模式,那么TransferStack就是非功能模式。

公平模式TransferQueue實(shí)現(xiàn)

首先它有一個(gè)內(nèi)部類QNode,通過上面分析發(fā)現(xiàn)可能會(huì)出現(xiàn)多個(gè)消費(fèi)者或者多個(gè)生產(chǎn)者,他們就會(huì)形成一個(gè)隊(duì)列,而QNode就是用來組成一個(gè)隊(duì)列的鏈表。

QNode主要有四個(gè)屬性:

 QNode next:表示下一個(gè)節(jié)點(diǎn);

     Object item;這里實(shí)際上是put出去的數(shù)據(jù),take方法生成的節(jié)點(diǎn)這里為null;

     Thread waiter;阻塞的線程,一般是生成這個(gè)節(jié)點(diǎn)的線程阻塞,其他線程進(jìn)來獲取到了數(shù)據(jù)后會(huì)喚醒;

      boolean isData:true則是put生成的,false表示是take生成的; 

既然take與put都依賴transfer方法,那么我們就來看transfer的實(shí)現(xiàn),源碼太長就不貼出來了,直接看總結(jié)的流程圖:

 java的SynchronousQueue是什么

因?yàn)檫@個(gè)方法并沒有采用鎖來控制,所以在整個(gè)流程中還有很多判斷,這些都是次要的,這里整理的是主要關(guān)鍵的流程。

簡單說明一下,整個(gè)流程就是依賴QNode鏈表,QNode的isData來區(qū)分是take還是put方法,鏈表中的節(jié)點(diǎn)的isData一定是相同的,QNode的item是take和put線程交換的數(shù)據(jù),只不過take方法交換的數(shù)據(jù)是null

可以看出來每次可以匹配的時(shí)候都是拿的最前面的節(jié)點(diǎn)進(jìn)來返回?cái)?shù)據(jù)。

非公平模式TransferStack

同樣TransferStack也有一個(gè)鏈表結(jié)構(gòu)叫做SNode ,SNode 的主要屬性如下:

SNode next: 下一個(gè)節(jié)點(diǎn);

SNode match:與之匹配成功的節(jié)點(diǎn);

Thread waiter:阻塞的線程;

Object item:要給出去的值;

int mode:節(jié)點(diǎn)分類,用于區(qū)分put還是take;

同樣整理了transfer的源碼流程圖,具體如下圖:

 java的SynchronousQueue是什么

同樣都是用鏈表實(shí)現(xiàn),但是這個(gè)首先結(jié)構(gòu)不一樣,多一個(gè)match表示與之匹配的節(jié)點(diǎn)。

通過流程可以看到mode一個(gè)有三個(gè)值,除了0,1外還有一個(gè)2用來表示正在匹配中的節(jié)點(diǎn)。主要就是在上圖中紅框部分,在發(fā)現(xiàn)頭部節(jié)點(diǎn)不是進(jìn)行中時(shí),當(dāng)前線程就會(huì)創(chuàng)建一個(gè)匹配中的節(jié)點(diǎn),然后加到頭部,最后去和后面的節(jié)點(diǎn)匹配。

如果發(fā)現(xiàn)正在匹配中則會(huì)把匹配的節(jié)點(diǎn)從鏈表中移除。 

通過流程分析可以看出TransferStack是后進(jìn)來的線程放到了頭部,會(huì)先進(jìn)行匹配。

感謝各位的閱讀,以上就是“java的SynchronousQueue是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對java的SynchronousQueue是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁標(biāo)題:java的SynchronousQueue是什么
瀏覽地址:http://weahome.cn/article/ipeesc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部