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