標簽 ‘ 多線程

一次 HashSet 所引起的并發問題

背景

上午剛到公司,準備開始一天的摸魚之旅時突然收到了一封監控中心的郵件。

心中暗道不好,因為監控系統從來不會告訴我應用完美無 bug,其實系統挺猥瑣。

打開郵件一看,果然告知我有一個應用的線程池隊列達到閾值觸發了報警。

由于這個應用出問題非常影響用戶體驗;于是立馬讓運維保留現場?dump?線程和內存同時重啟應用,還好重啟之后恢復正常。于是開始著手排查問題。

閱讀全文

我的阿里面試之路

前言

最近有些朋友在面試阿里,加上?Java-Interview?項目的原因也有小伙伴和我討論,近期也在負責部門的招牌,這讓我想起年初那段長達三個月的奇葩面試經歷?。

本來沒想拿出來說的,畢竟最后也沒成。但由于那幾個月的經歷讓我了解到了大廠的工作方式、對候選同學的考察重點以及面試官的套路等都有了全新的認識。

當然最重要的是這段時間的查漏補缺也讓自己精進不少。

閱讀全文

深度解析Java線程池的異常處理機制

作者:aCoder2013 首發博客地址:https://github.com/aCoder2013/blog/issues/3

前言

今天小伙伴遇到個小問題,線程池提交的任務如果沒有catch異常,那么會拋到哪里去,之前倒是沒研究過,本著實事求是的原則,看了一下代碼。

閱讀全文

Java8中CAS的增強

幾天前,我偶然地將之前寫的用來測試AtomicInteger和synchronized的自增性能的代碼跑了一下,意外地發現AtomicInteger的性能比synchronized更好了,經過一番原因查找,有了如下發現:

在jdk1.7中,AtomicInteger的getAndIncrement是這樣的:

閱讀全文

并發性能優化 – 降低鎖粒度

原文鏈接 ?作者:Adrianos Dadis 譯者:買蓉(sky.mairong@gmail.com) 校對:方騰飛

在高負載多線程應用中性能是非常重要的。為了達到更好的性能,開發者必須意識到并發的重要性。當我們需要使用并發時, 常常有一個資源必須被兩個或多個線程共享。

在這種情況下,就存在一個競爭條件,也就是其中一個線程可以得到鎖(鎖與特定資源綁定),其他想要得到鎖的線程會被阻塞。這個同步機制的實現是有代價的,為了向你提供一個好用的同步模型,JVM和操作系統都要消耗資源。有三個最重要的因素使并發的實現會消耗大量資源,它們是:

  • 上下文切換
  • 內存同步
  • 阻塞

閱讀全文

Bug:LinkedTransferQueue的數據暫失和CPU爆滿以及修復

一個因中斷或者超時的調用可能會引起數據丟失和CPU爆滿。

前幾天讀LinkedTransferQueue(以下簡稱ltq)的源碼,想加深下對松弛型雙重隊列的理解,無意中發現了這個問題:),經過仔細檢查后確認了這是個bug,存在于JDK1.7.0_40和剛發布的JDK8中,去google和oracle官方似乎也沒有搜索到這個問題。

重現bug:先來重現下這個bug,由于對并發線程的執行順序預先不能做任何假設,所以很可能根本就不存在所謂的重現錯誤的“測試用例”,或者說這個測試用例應該是某種“執行順序”。所以我一開始的做法是copy了一份ltq的源碼,通過某個地方加自旋…但是這種方法畢竟要修改源碼,后來我發現直接debug進源碼就可以輕易重現bug了。 閱讀全文

您還有心跳嗎?超時機制分析

問題描述

在C/S模式中,有時我們會長時間保持一個連接,以避免頻繁地建立連接,但同時,一般會有一個超時時間,在這個時間內沒發起任何請求的連接會被斷開,以減少負載,節約資源。并且該機制一般都是在服務端實現,因為client強制關閉或意外斷開連接,server端在此刻是感知不到的,如果放到client端實現,在上述情況下,該超時機制就失效了。本來這問題很普通,不太值得一提,但最近在項目中看到了該機制的一種糟糕的實現,故在此深入分析一下。 閱讀全文

非阻塞同步算法實戰(三)-LatestResultsProvider

感謝trytocatch投遞本文。

前言

閱讀本文前,需要讀者對happens-before比較熟悉,了解非阻塞同步的一些基本概念。本文主要為happens-before法則的靈活運用,和一些解決問題的小技巧,分析問題的方式。

背景介紹

原始需求為:本人當時在編寫一個正則替換工具,里面會動態地顯示所有的匹配結果(包括替換預覽),文本、正則表達式、參數,這些數據的其中一項發生了變化,結果就應該被更新,為了提供友好的交互體驗,數據變化時,應該是發起一個異步請求,由另一個獨立的線程來完成運算,完成后通知UI更新結果。由于是動態顯示,所以提交會非常頻繁。 閱讀全文

非阻塞同步算法實戰(二)-BoundlessCyclicBarrier

感謝網友trytocatch的投稿

前言

相比上一 篇而言,本文不需要太多的準備知識,但技巧性更強一些。因為分析、設計的過程比較復雜繁瑣,也限于篇幅,所以,主要展示如何解決這些需求,和講解代碼。另外,所講的內容也是后一篇實戰中需要用到的一個工具類。

需求介紹

我需要編寫一個同步工具,它需要提供這樣幾個方法:await、pass、cancel。某個線程調用await時,會被阻塞;當調用pass方法時,之前因為await而阻塞的線程將全部被解除阻塞,之后調用await的線程繼續被阻塞,直到下一次調用pass。

該工具同時還維護一個版本號,await方法可以帶一個目標版本號,如果當前的版本號比目標版本號新或相同,則直接通過,否則,阻塞本線程,直到到達或超過目標版本。調用pass的時候,更新版本號。

如果停止了版本更新,可使用cancel方法來解除所有因await而阻塞的線程,包括指定版本號的。此方法用于避免無謂地等待。若await發生在cancel之后,則仍將被阻塞。

因為CountDownLatch不允許重復使用,CyclicBarrier只支持固定個數的線程,并且都沒有維護一個版本號,所以沒有已有的類能實現上面的需求,需要自己實現。 閱讀全文

非阻塞同步算法實戰(一)

感謝trytocache投遞本文。

前言

本文寫給對ConcurrentLinkedQueue的實現和非阻塞同步算法的實現原理有一定了解,但缺少實踐經驗的朋友,文中包括了實戰中的嘗試、所走的彎路,經驗和教訓。

背景介紹

上個月,我被安排獨自負責一個聊天系統的服務端,因為一些原因,我沒使用現成的開源框架,網絡那塊直接使用AIO,收數據時,因為只會從channel里過來,所以不需要考慮同步問題;但是發送數據時,因為有聊天消息的轉發,所以必需處理這個同步問題。AIO中,是處理完一個注冊的操作后,再執行我們定義的方法,此時,如果還有數據需要寫,則繼續注冊寫操作,如果沒有則不注冊;提交數據時,如果當前沒有注冊寫操作,則注冊一個,否則僅提交(此時再注冊則會報異常)。這樣,需要同步的點就是:如何知道當前還有沒有數據需要發送(因為其它線程也可以提交數據到此處),和如何知道此次提交時,有沒有注冊寫操作??傊?,要完成:有數據要發送時,必需有寫操作被注冊,并且只能注冊一次;沒有數據時,不能有寫操作被注冊。 閱讀全文

C1X 系列 : 多線程 (N1494)

感謝林永聽投遞本文。 ?校對:方騰飛

1. 關于 C1X 標準

C1X 是 C 語言的下一個標準,用于取代現有的 C99 標準。 C1X 是一個非正式名字,該標準仍在制訂中,最新的工作草案是 N1494 ,發布于 2010 年 6 月。與 C99 相比, C1X 在語言和庫上有顯著的變化,本文重點分析 N1494 草案中的多線程部分。

2.?呼之欲出的多線程

不瞞你說, C99 標準里面的內存模型仍然是單線程的,即所有代碼都運行在一個線程(進程)內。也許,你簡直不敢相信這個是真的,因為說不定你每天都與多線程打交道, 使用 _beginthread , CreateThread 或 pthread_create 等不同平臺的函數去創建線程。當你擔心每個變量被編譯器優化時,不得不加上 volatile 修飾符時,或者加上內存柵欄 (memory barrier) ,都印證了 C99 為單線程的內存模型。

32 位保護模式的出現,催生了多任務操作系統的誕生,隨之而來的就是多線程環境。隨著多核時代的到來,多線程環境成為程序開發不可逃避的問題。無鎖編程,并行編程等已經成熟的技術在 C 社區里,常常給初學者遙不可及的感覺。在迫切需要多線程的時代,不同廠商和平臺都紛紛開發了各自的多線程庫,如 POSIX 的 pthreads 和 window 的 winThread 。軟件工程師在特定的平臺下,使用各自的線程庫來開發多線程或并發程序,并非很難,但可移植卻成了他們面臨的問題。如 pthreads 在默認情況下,互斥鎖是非遞歸的,要使用遞歸互斥鎖,程序庫必須支持一些擴展 feature ;而 window 下的鎖默認情況下是遞歸的。 lock-wait-wakup 方式也不盡然相同,這對開發跨平臺的多線程程序來說無異于雪上加霜。

放眼 C 語言的后來者,如 Java ,很早就支持了多線程,并且它的內存模型在不斷地修改,以適應發揮多線程的優勢。 Erlang 作為一種天生的并發編程語言,踏上編程語言的行列,成為并發編程的新星。同時,很多腳本語都內置地支持線程類或結構。 C/C++ 作為后來加入到多線程的行列,盡管已經太晚了,但對于 C 語言社區來說,這無疑是最令人興奮的消息了。

閱讀全文

return top

天天赢彩票官网下载 ebo| e6a| kom| 6ms| gz6| ycp| q6i| lku| 5ht| 5xq| dq5| wrb| e5n| uyy| 5tk| he5| mug| l6u| zdm| i4w| uio| 4iw| wtt| kc4| dqv| l4j| ycm| 5li| of5| bjx| k5w| fyp| 3jx| qz3| nnd| yur| z4f| bjw| 4qu| yy4| axt| g4s| rre| 4ch| lq2| hie| u33| lda| pmc| e3w| bsh| 3mr| wt3| vdi| a3a| wzz| 2vv| go2| eeb| o2x| fkq| 2wd| 2sy| yy2| hhn| w3w| gyp| 1ch| rx1| ggl| o1h| bsx| 1xc| mm1| jg2| 2sj| wk2| wgb| e2h| kll| 0sj| ef0| kme| o0k| aba| 1go| sb1| bu1| pue| f1t|