第20講丨并發(fā)包中和有什么區(qū)別_第1頁
第20講丨并發(fā)包中和有什么區(qū)別_第2頁
第20講丨并發(fā)包中和有什么區(qū)別_第3頁
第20講丨并發(fā)包中和有什么區(qū)別_第4頁
第20講丨并發(fā)包中和有什么區(qū)別_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

Concurrent類型基于lock- 而LinkedBlockingQueueBlockingQueue不知道你有沒有注意到,java.util.concurrent包提供的容器(Queue、List、Set)、MapConcurrent*、CopyOnWriteBlocking等三類,同樣Concurrent類型沒有類似CopyOnWrite但是,凡事都是有代價的,Concurrent往往提供了較低的遍歷一致性。你可以這樣理解所謂的弱一致性,例如,當利用迭代器遍歷時,如果容器發(fā)生修改,迭代器仍然可以繼續(xù)進行遍歷。與弱一致性對應的,就是我介紹過的同步容器常見的行為“fai-fast器在遍歷過程中發(fā)生了修改,則拋出Concurrettxceptn,不再繼續(xù)遍弱一致性的另外一現(xiàn)是,size等操作準確性是有限的,未必是100%準確。今天的問題是又是一個,你是否了解并發(fā)包內(nèi)部不同容器實現(xiàn)的設計目的區(qū)Executor框架提供的各種線程池,同樣無法離開隊列。面試官可以從不同角度,比為了能更好地理解這一講,需要你掌握一些基本的隊列本身和數(shù)據(jù)結(jié)構(gòu)方面知識,如果這方面知識比較薄弱,《數(shù)據(jù)結(jié)構(gòu)與算法分析》是一本比較全面的參考書,專欄還是盡量專注于Jaa領域的特性。我在專欄第8講中介紹過,常見的集合中如LinkedList是個Deque,只不過不是線程安全的。下面這張圖是Java并發(fā)類庫提供的各種各樣的線程安全隊列實現(xiàn),注意,圖中并未將非我們可以從不同的角度進行分類,從基本的數(shù)據(jù)結(jié)構(gòu)的角度分析,有兩個特別的equeConctdue和edBge。e從上面這些角度,能夠理解ConcurretdDque和dBke從行為特征來看,絕大部分Queue都是實現(xiàn)了BlockingQueue接口。在常規(guī)隊列操作基礎上,Blocking(take)等待元素進隊,或者插 3 5Etake()throws67 11voidput(Ee)throws另一個BlockingQueue經(jīng)常被的點,就是是否有界(Bounded、Unbounded),這ArrayBlockingQueue是最典型的的有界隊列,其內(nèi)部以final的數(shù)組保存數(shù)據(jù),數(shù)組的大小就決定了隊列的邊界,所以我們在創(chuàng)建ArrayBlockingQueue時,都要指定容量,1publicArrayBlockingQueue(intcapacity,booleandBke,容易被誤解為無邊界,但其實其行為和內(nèi)部代碼都是基于有界為IntXE,成為了隊列。nousQueue,這是一個非常奇葩的隊列實現(xiàn),每個刪除操作都要等待插入操作,反之每個插入操作也都要等待刪除動作。那么這個隊列的容量是多少呢?是1其實不是的,其內(nèi)部容量是。DelayedQueue和LinkedTransferQueue同樣是無邊界的隊列。對于無邊界的隊列,有一個自然的結(jié)果,就是put操作也不會發(fā)生其他BlockingQueue的那種等待情如果我們分析不同隊列的底層實現(xiàn),BlockingQueue型的LinkedBlockingQueue。/**Lockheldbytake,poll,etcprivatefinalReentrantLocktakeLock=new3/**WaitqueueforwaitingtakesprivatefinalConditionnotEmpty=6/**Lockheldbyput,offer,etcprivatefinalReentrantLockputLock=new9/**WaitqueueforwaitingputsprivatefinalConditionnotFull=ReentrantLock的條件變量用法的時候分析過ArrayBngQueudBgQueuetmptytul都是同一個再入鎖的條件變量,而ndBngQueue鎖操作的粒度,頭、尾操作使用不同的鎖,所以在通用場景下,它的吞吐量相對要更好一takeArrayBlockingQueuepublicEtake()throwsInterruptedException2E3int4AtomicIntegercount=5ReentrantLocktakeLock=trywhile(count.get()==0) x=c=if(c>}finally}if(c==return}ConcurrentLinkedQueueCASSynchronousQueue,Java6CAS替換掉了原本基于鎖的邏輯,同步開銷比較小。它是Executors.newCachedThreadPool()的默認隊列。在實際開發(fā)中,我提到過Queue被廣泛使用在生產(chǎn)者-消費者場景,比如利用BlockingQueueimportimport3publicclassConsumerProducerpublicstaticfinalStringEXIT_MSG="Goodpublicstaticvoidmain(String[]args)//8BlockingQueue<String>queue=new9Producerproducer=newConsumerconsumer=newnewnew} staticclassProducerimplementsRunnableprivateBlockingQueue<String>publicProducer(BlockingQueue<String>{this.queue=}publicvoidrun()for(inti=0;i<20;i++)Stringmsg="Message"+item:"}catch(InterruptedException{}}trySystem.out.println("Timeto}catch(InterruptedExceptione)}}}staticclassConsumerimplementsprivateBlockingQueue<String>publicConsumer(BlockingQueue<String>}publicvoidrun()Stringwhile(!EXIT_MSG.equalsIgnoreCase((msg=System.out.println("Consumeditem:"+}System.out.println("Gotexitmessage,}catch(InterruptedExceptione)}}}}Blocking去實現(xiàn)輪詢、條件判斷(如檢查poll返回值是否null)等邏輯,如果沒有特別的場景要求,Blocking實現(xiàn)起來代碼更加簡單、直觀。LinkedBlockingQueue、ArrayBlockingQueueSynchronousQueue考慮應用場景中對隊列邊界的要求。ArrayBlockingQueue是有明確的容量限制的,而LinkedBlockingQueue則取決于我們是否在創(chuàng)建時指定,SynchronousQueue則干脆ArrayBlockingQueue要比LinkedBlockingQueue通用場景中,LinkedBlockingQueueArrayBlockingQueue,因為它ArrayBlockingQueue實現(xiàn)比較簡單,性能更好預測,屬于表現(xiàn)穩(wěn)定的“選手”。CountDownLatch,但是SynchronousQueue也是完美符合這種場景SynchronousQueue今天我分析了Java中讓人眼花繚亂的各種線程安全隊列,試圖從幾個角度,讓每個隊列的關于今天我們討論的題目你做到心中有數(shù)了嗎?今天的內(nèi)容側(cè)重于Jaa官也可能從算法的角度來,所以今天留給你的思考題是,指定某種結(jié)構(gòu),比如棧,用它BgQueue,實現(xiàn)思路是怎樣的呢? 售賣。頁面已增加防盜追蹤,將依法其上一 第19講|Java并發(fā)包提供了哪些并發(fā)工具類下一 第21講|Java并發(fā)類庫提供的線程池有哪幾種?分別有什么特點 42這個看著很吃力啊,都沒接觸過丘 寫入棧(A)中的數(shù)據(jù)轉(zhuǎn)移到消費棧(C)中,轉(zhuǎn)移完成后繼續(xù)(sign)繼續(xù)消費,2石頭獅 7 ConcurrentLinkedDequeLinkedBlockingQueue功能區(qū)別。這段應該是"ConcurrentLinkedDeque和LinkedBlockingDeque的主要功獼猴 4{[無呢可 南北少 1么head指向添加的元素,而tail指向自己,始終搞不明白,經(jīng)過p.casNext(nullnewNode)操作之后,這中間的變化到底是怎么回事?您能解答下嗎?望指點.我的:LEE呂 老師你好,在讀ArrayBlockingQueue源碼的時候,發(fā)現(xiàn)很多地方都有final醬了個 1漢 愛新覺羅老 1ConcurrentModi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論