摘要:針對高質(zhì)量多線程并發(fā)程序設(shè)計時為防死崩等現(xiàn)象的出現(xiàn),比如使用之前的和等,每每需要考慮性能死鎖公平性資源管理以及如何避免線程安全性方面帶來的危害等諸多因素,往往會采用一些較為復(fù)雜的安全策略,加重了程序員的開發(fā)負(fù)擔(dān)。
大家好,最近由于公司的事情不是很多,準(zhǔn)備開篇寫一寫concurrent這一塊,因為最近好多面試者對這個都不是很了解,有的是知其然不知其所以然,我寫這篇(系列)文章的初衷是為了總結(jié)和歸納這一塊,如果本文能夠?qū)Υ蠹規(guī)硪欢ǖ膸椭敲匆欢ㄊ俏夷蟮臉s耀,好了,話不多說我們開始探秘concurrent吧。
首先從字面意思我們能理解到concurrent是“同時發(fā)生的”,在java中自然是用來做并發(fā)使用的,這個concurrent 包是java5才提出的,然而經(jīng)過幾個版本的更迭,目前已經(jīng)是大家都會深入用到,或者是多少會接觸到的,其實在java中已經(jīng)有Thread,Runnable等多線程的實現(xiàn);我們?yōu)槭裁匆玫絚oncurrent包來做呢?下面我將帶大家一步一步的了解。
針對高質(zhì)量Java多線程并發(fā)程序設(shè)計時,為防死崩等現(xiàn)象的出現(xiàn),比如使用java之前的wait()、notify()和synchronized等,每每需要考慮性能、死鎖、公平性、資源管理以及如何避免線程安全性方面帶來的危害等諸多因素,往往會采用一些較為復(fù)雜的安全策略,加重了程序員的開發(fā)負(fù)擔(dān)。為了減少甚至是去除咱們這種后顧之憂, Doug Lea為大家推出了這個解決方案,讓眾多java開發(fā)者如沐春風(fēng)。
在java8中concurrent一共有21個接口、38個類其中包括抽象類和內(nèi)部類、1個枚舉類、6種異常方式,當(dāng)然這個數(shù)字都不重要,大家在看api的時候只會找自己關(guān)注的部分。
1. BlockingDequeBlockingDeque繼承自BlockingQueue和 Deque ;BlockingQueue也是java.util.concurrent包下面的一個接口,而Deque則屬于java.util。
來自官方的一段說明是,該接口定義了在deque兩端訪問元素的方法。提供了插入、刪除和檢查元素的方法。這些方法中的每個存在兩種形式:一個拋出一個異常,如果操作失敗,另一個返回一個特殊的值(無論是null或false,取決于操作)。插入操作的后一種形式是專為使用有容量限制deque實現(xiàn);在大多數(shù)實現(xiàn)中,插入操作不會失敗。
這個隊列的特性其實是保證了先進先出的原則,與列表接口不同,此接口不提供對元素索引訪問的支持。在實現(xiàn)中Deque不強制禁止空值,但是不推薦這樣去做。
2. BlockingQueue這個接口和上面一個長得有點像,但不要混淆了,干妹妹和干妹妹還不是一個意思呢(好污...)。BlockingQueue是用來對不同操作進行不同處理的(你這不是廢話么...)BlockingQueue一共有四種處理形式,分別為 Throws exception、 Special value、 Blocks(不是打籃球的蓋帽)、 Times out;其實核心意思就是不滿足的就拋出異常、根據(jù)操作返回一個特定值true或false、讓當(dāng)前線程執(zhí)行到成功為止,最后就是設(shè)定一個超時時間,以免第三步一直不成功。
下面是官方給出的一個例子,大家可以感受下:
class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } }
好啦,本篇文章就先到這里了,我們后面會繼續(xù)講這個神奇的concurrent包,大家有興趣的話可以關(guān)注一下本文。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65029.html
摘要:通過方法提交一個任務(wù),并且通過對象來獲得結(jié)果。對象可以取消運行任務(wù),設(shè)置等待時間,獲取任務(wù)狀態(tài),最終獲得任務(wù)結(jié)果。類似于,但是并不會有返回結(jié)果和異常信息。由兩個階段所觸發(fā)的,沒有保證的結(jié)果用于依賴階段的計算。 本系列關(guān)于concurrent的代碼示例,是被我分割成了小部分,在系列文章結(jié)束以后,我會將較為完整的代碼上傳,在寫的過程中我會參考官方API以及其他牛人的見解,大家有不同的看法可...
摘要:并發(fā)和并行并發(fā)和并行是兩個非常容易被混淆的概念。并發(fā)說的是在一個時間段內(nèi),多件事情在這個時間段內(nèi)交替執(zhí)行。并行說的是多件事情在同一個時刻同事發(fā)生。由于線程池是一個線程,得不到執(zhí)行,而被餓死,最終導(dǎo)致了程序死鎖的現(xiàn)象。 同步(Synchronous)和異步(Asynchronous) 同步和異步通常來形容一次方法調(diào)用,同步方法調(diào)用一旦開始,調(diào)用者必須等到方法調(diào)用返回后,才能繼續(xù)后續(xù)的行為...
摘要:所有示例代碼請見下載于基本概念并發(fā)同時擁有兩個或者多個線程,如果程序在單核處理器上運行多個線程將交替地?fù)Q入或者換出內(nèi)存這些線程是同時存在的,每個線程都處于執(zhí)行過程中的某個狀態(tài),如果運行在多核處理器上此時,程序中的每個線程都 所有示例代碼,請見/下載于 https://github.com/Wasabi1234... showImg(https://upload-images.jians...
摘要:有三種狀態(tài)運行關(guān)閉終止。類類,提供了一系列工廠方法用于創(chuàng)建線程池,返回的線程池都實現(xiàn)了接口。線程池的大小一旦達到最大值就會保持不變,在提交新任務(wù),任務(wù)將會進入等待隊列中等待。此線程池支持定時以及周期性執(zhí)行任務(wù)的需求。 這是java高并發(fā)系列第19篇文章。 本文主要內(nèi)容 介紹Executor框架相關(guān)內(nèi)容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...
摘要:方法由兩個參數(shù),表示期望的值,表示要給設(shè)置的新值。操作包含三個操作數(shù)內(nèi)存位置預(yù)期原值和新值。如果處的值尚未同時更改,則操作成功。中就使用了這樣的操作。上面操作還有一點是將事務(wù)范圍縮小了,也提升了系統(tǒng)并發(fā)處理的性能。 這是java高并發(fā)系列第21篇文章。 本文主要內(nèi)容 從網(wǎng)站計數(shù)器實現(xiàn)中一步步引出CAS操作 介紹java中的CAS及CAS可能存在的問題 悲觀鎖和樂觀鎖的一些介紹及數(shù)據(jù)庫...
閱讀 1395·2021-11-25 09:43
閱讀 816·2021-11-18 10:02
閱讀 3025·2021-09-07 09:59
閱讀 2819·2021-08-30 09:44
閱讀 2976·2019-08-30 13:17
閱讀 2374·2019-08-29 12:17
閱讀 1731·2019-08-28 17:57
閱讀 1343·2019-08-26 14:04