同步容器、并發(fā)容器及使用

1.什么是同步容器窜觉?同步容器使用什么方式實現(xiàn)線程安全

同步容器可以簡單的理解位通過synchronized來實現(xiàn)同步的容器撰筷,如果有多個線程調(diào)用同步容器的方法陈惰,它們將會串行執(zhí)行。包括Vector和Hashtable,以及由同步容器封裝類毕籽。Collections.synchronizedXxx等工廠方法創(chuàng)建的類抬闯。

同步容器實現(xiàn)線程安全的方式將它們的狀態(tài)封裝起來,并對每個公有方法同步关筒,使得每次只有一個線程能夠訪問容器的狀態(tài)溶握。

注意通過在迭代期間持有Vector的鎖,可以防止其他線程在迭代期間修改Vector蒸播,但也因此降低了并發(fā)性睡榆。

2.導(dǎo)致拋出ConcurrentModificationException異常的原因?

首先袍榆,對容器類進行迭代的標準方式就是使用Iterator肉微,但在設(shè)計同步容器類的迭代器時并沒有考慮到并發(fā)修改的問題,并且它們表現(xiàn)出的行為是”及時失敗“(fail-fast)的蜡塌。這就意味著碉纳,當它們發(fā)現(xiàn)容器在迭代過程中被修改時,就會拋出一個ConcurrentModificationException異常馏艾。

其次劳曹,這種”及時失敗“的迭代器并不是一種完備的處理機制,只是”善意地“捕獲并發(fā)錯誤琅摩,因此只能作為并發(fā)問題的預(yù)警指示器铁孵。

最后,如果不希望在迭代期間對容器加鎖房资,那么一種替代的方式就是”克隆“容器蜕劝,并在副本上進行迭代。

3.經(jīng)典并發(fā)容器類的介紹

通過并發(fā)容器來代替同步容器,可以極大地提高伸縮性并降低風(fēng)險岖沛。

ConcurrentHashMap:基于散列的Map暑始,并不是將每個方法都在同一個鎖上同步使得每次只能有一個線程訪問線程,而使用一種更細粒度的加鎖機制來實現(xiàn)更大程度的共享婴削。這種機制稱為分段鎖(Lock Striping)廊镜。在這種機制中,任意數(shù)量的讀取線程可以并發(fā)地訪問map唉俗,執(zhí)行讀取操作的線程和執(zhí)行寫入操作的線程可以并發(fā)地訪問map嗤朴,并且一定數(shù)量的寫入線程可以并發(fā)地修改map。ConcurrentHashMap帶來的結(jié)果是虫溜,在并發(fā)訪問的環(huán)境下將實現(xiàn)更高的吞吐量雹姊,而在單線程環(huán)境中只損失非常小的性能。

ConcurrentHashMap與其他并發(fā)容器一起增強了同步容器類:它們提供的迭代器不會拋出ConcurrentModificationException衡楞,因此不需要在迭代過程中對容器加鎖吱雏。ConcurrentHashMap返回的迭代器具有弱一致性。弱一致性的迭代器可以容忍并發(fā)的修改寺酪,當創(chuàng)建迭代器時會遍歷已有的元素坎背,并可以(但是不保證)在迭代器被構(gòu)造后將修改操作反應(yīng)給容器替劈。

CopyOnWriteArrayList用于替代同步List寄雀,在迭代期間不需要對容器進行加鎖或復(fù)制≡上祝“寫入時復(fù)制(Copy-On-Write)”容器的線程安全性在于盒犹,只要是正確發(fā)布一個事實不可變的對象,那么在訪問該對象時就不再需要進一步的同步眨业。在每次修改時急膀,都會創(chuàng)建并重新發(fā)布一個新的容器副本,從而實現(xiàn)可變性龄捡。

注意:僅當?shù)牟僮鬟h遠多于修改操作時卓嫂,才應(yīng)該使用“寫入時復(fù)制“的容器。

4.阻塞隊列和生產(chǎn)者-消費者模式

阻塞隊列分為有界隊列和無界隊列聘殖,支持阻塞的put晨雳、take和定時的offer和poll方法。常見的生產(chǎn)者-消費者設(shè)計模式就是線程池和工作隊列的組合奸腺。

offer方法:如果數(shù)據(jù)項不能夠被添加到隊列中餐禁,那么將返回一個失敗的狀態(tài)而不是阻塞直至可以添加。這個方法的使用可以提供更靈活的方式來處理負載過荷的情況突照,例如減輕負載帮非,將多余的工作項序列化并寫入磁盤,減少生產(chǎn)者的數(shù)量,或者通過某種方式來抑制生產(chǎn)者線程末盔。

5.雙端隊列與工作密戎恕(work stealing)

在工作密取的設(shè)計中,每個消費者都有自己的雙端隊列庄岖。如果一個消費者完成自己雙端隊列中的全部工作豁翎,那么它可以從其他的消費者雙端隊列秘密獲取工作。

優(yōu)勢:比傳統(tǒng)的生產(chǎn)者-消費者模式具有更高的伸縮性隅忿,減少競爭的發(fā)生心剥。

6.阻塞產(chǎn)生的原因?中斷異常出現(xiàn)的處理方式背桐?

導(dǎo)致線程阻塞的原因包括:等待I/O操作結(jié)束优烧,等待獲取一個鎖,等待從一個阻塞的方法中醒過來(thread.sleep)链峭,或者等待另一個線程的計算機結(jié)果畦娄。

當代碼調(diào)用中拋出一個InterruptedException異常的方法時,基本有兩種主要選擇方案:

傳遞InterruptedException弊仪。將異常的處理權(quán)傳遞給方法的調(diào)用者(可以捕獲異常熙卡,然后執(zhí)行某種清理的操作再傳遞給上層)。

恢復(fù)中斷励饵。

屏蔽中斷:即對Thread進行擴展驳癌,并且控制調(diào)用棧上所有更高層次的代碼。

7.同步工具類

同步工具類包含一些特定的結(jié)構(gòu)化屬性:它們封裝了一些狀態(tài)役听,這些狀態(tài)將決定執(zhí)行同步工具類的線程是繼續(xù)執(zhí)行還是等待颓鲜。包括信號量(Semaphore)、柵欄(Barrier)典予、以及閉鎖(Latch)甜滨。

閉鎖

? 閉鎖可以用來確保某些活動直到其他活動都完成后才繼續(xù)執(zhí)行。當閉鎖到達結(jié)束狀態(tài)后瘤袖,將不會再改變狀態(tài)衣摩。

? 啟動門將使主線程能夠同時釋放所有工作線程,而結(jié)束們則是主線程能夠等待最后一個線程執(zhí)行完成捂敌,而不是順序地等待每個線程執(zhí)行完成艾扮。

?注意: FutureTask也可以用作閉鎖,并且可以處于三種狀態(tài):等待運行黍匾、正在運行和運行完成栏渺。

信號量

? 計數(shù)信號量用來控制同時訪問某個特定資源的操作數(shù)量,或者同時執(zhí)行某個指定操作的數(shù)量锐涯。計數(shù)信號量還可以用來實現(xiàn)某種資源池磕诊,或者對容器施加邊界。

?注意: 計數(shù)信號量的特殊情況二值信號量,即初始值為1的semaphore霎终,二值信號量可以用作互斥體滞磺,并且具備不可重入的加鎖語義:誰擁有這個唯一的許可,誰就擁有了互斥體莱褒。

柵欄

柵欄類似于閉鎖击困,它能阻塞一組線程直到某個事情發(fā)生。柵欄與閉鎖的關(guān)鍵區(qū)別在于广凸,所有線程必須同時到達柵欄的位置阅茶,才能繼續(xù)執(zhí)行。閉鎖用于等待事情谅海,而柵欄用于等待其他線程脸哀。柵欄可被重用。

8.如何構(gòu)建緩存的學(xué)習(xí)扭吁?

為什么要使用緩存撞蜂?

? ? 緩沖可以縮短響應(yīng)時間,減少不必要的重復(fù)操作侥袜。

設(shè)計緩沖的幾點注意事項蝌诡?

? ? ?是否是線程安全的,是否是原子操作枫吧。

? ? ?有沒有緩存污染的情況浦旱,對于失敗的緩存能否有效的清除。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末由蘑,一起剝皮案震驚了整個濱河市闽寡,隨后出現(xiàn)的幾起案子代兵,更是在濱河造成了極大的恐慌尼酿,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植影,死亡現(xiàn)場離奇詭異裳擎,居然都是意外死亡,警方通過查閱死者的電腦和手機思币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門鹿响,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谷饿,你說我怎么就攤上這事惶我。” “怎么了博投?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵绸贡,是天一觀的道長。 經(jīng)常有香客問我,道長听怕,這世上最難降的妖魔是什么捧挺? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮尿瞭,結(jié)果婚禮上闽烙,老公的妹妹穿的比我還像新娘。我一直安慰自己声搁,他們只是感情好黑竞,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疏旨,像睡著了一般摊溶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上充石,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天莫换,我揣著相機與錄音,去河邊找鬼骤铃。 笑死拉岁,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惰爬。 我是一名探鬼主播喊暖,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撕瞧!你這毒婦竟也來了陵叽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤丛版,失蹤者是張志新(化名)和其女友劉穎巩掺,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體页畦,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡胖替,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了豫缨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片独令。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖好芭,靈堂內(nèi)的尸體忽然破棺而出燃箭,到底是詐尸還是另有隱情,我是刑警寧澤舍败,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布招狸,位于F島的核電站希痴,受9級特大地震影響途样,放射性物質(zhì)發(fā)生泄漏备蚓。R本人自食惡果不足惜熙兔,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挽懦。 院中可真熱鬧翰意,春花似錦、人聲如沸信柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔嚷。三九已至进鸠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間形病,已是汗流浹背客年。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留漠吻,地道東北人量瓜。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像途乃,于是被迫代替她去往敵國和親绍傲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容