• <input id="qucwm"><u id="qucwm"></u></input>
  • <menu id="qucwm"></menu>
  • <input id="qucwm"><tt id="qucwm"></tt></input>
  • <input id="qucwm"><acronym id="qucwm"></acronym></input>
  • 標簽 ‘ Concurrent

    如何優雅的使用和理解線程池

    前言

    平時接觸過多線程開發的童鞋應該都或多或少了解過線程池,之前發布的《阿里巴巴 Java 手冊》里也有一條:

    可見線程池的重要性。

    簡單來說使用線程池有以下幾個目的:

    • 線程是稀缺資源,不能頻繁的創建。
    • 解耦作用;線程的創建于執行完全分開,方便維護。
    • 應當將其放入一個池子中,可以給其他任務進行復用。

    閱讀全文

    CompletableFuture 不能被中斷

    原文鏈接?作者:Tomasz Nurkiewicz ?譯者:simonwang

    我之前寫過一篇關于InterruptedException and interrupting threads的文章??傊?,如果你調用Future.cancel(),那么Future不僅會終止正在等待的get(),還會試圖去中斷底層的線程。這是個很重要的特征,它能夠使線程池變得更加利于使用。我在之前的文章中也說過,相對于標準的Future,盡量使用CompletableFuture。但事實證明,Future的更加強大的兄弟-CompletableFuture并不能優雅地處理cancel()。

    閱讀全文

    Guava官方文檔-RateLimiter類

    原文鏈接 作者:Dimitris Andreou ?譯者:魏嘉鵬 校對:方騰飛token_bucket

    RateLimiter 從概念上來講,速率限制器會在可配置的速率下分配許可證。如果必要的話,每個acquire()?會阻塞當前線程直到許可證可用后獲取該許可證。一旦獲取到許可證,不需要再釋放許可證。

    校對注:RateLimiter使用的是一種叫令牌桶的流控算法,RateLimiter會按照一定的頻率往桶里扔令牌,線程拿到令牌才能執行,比如你希望自己的應用程序QPS不要超過1000,那么RateLimiter設置1000的速率后,就會每秒往桶里扔1000個令牌。

    com.google.common.util.concurrent.RateLimiter
    
    @ThreadSafe
    @Betapublic
    abstract class RateLimiter?extends Object
    

    閱讀全文

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

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

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

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

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

    閱讀全文

    Harris’s Linked List

    原文地址?作者:Pedro Ramalhete,譯者:葉磊,校對:周可人

    在學術論文中Harris Linked List是使用最廣泛的并發數據結構之一。

    Harris Linked List是一個基于linked-list的并發有序set(或者是map),可進行無鎖性質的插入,刪除和查找操作。

    http://research.microsoft.com/pubs/67089/2001-disc.pdf

    這篇文章最早在2001年的DISC會議上發表,作者是Tim Harris,目前在Oracle就職。

    https://labs.oracle.com/pls/apex/f?p=labs:bio:0:296

    閱讀全文

    Ticket Lock的Relaxed Atomics優化

    原文地址 作者:Pedro Ramalhete,譯者:周可人,校對:梁海艦

    Tick lock是mutual lock的一種簡單實現:

    http://web.mit.edu/6.173/www/currentsemester/readings/R06-scalable-synchronization-1991.pdf

    它是由John Mellor-Crummey和Michael Scott在1991年提出的(pdf中2.2節),感謝C++11和C11中新的內存模型,我們可以對單個變量進行具有屏障或者不具有屏障的原子操作。當屏障沒有使用,只有原子性保證時,我們稱之為“relaxed atomic”:

    http://en.cppreference.com/w/cpp/atomic/memory_order

    注意在C11/C++11內存模型中,一個原子變量并不具有內在的“順序一致性”或者“relaxed”性質,然而我們可以在每次訪問的時選擇它的行為。

    原子修飾符只能保證原子性,即這個變量會被單步讀或寫。其他語言,如Java和Scala則不同,它們可以保證幾乎所有的原生類型提供原子性保證,從而表現為“relaxed atomic”。并且,所有被聲明為順序一致性的變量可以在整個程序中保持性質(除非在Java中使用sun.misc.unsafe)。盡管這個細微的差異可能看起來并不重要,但是當我們的目標是從同步或是并發算法中挖掘最大性能時,就需要關注這個差異了。

    閱讀全文

    并發集合(七)創建并發隨機數

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

    創建并發隨機數

    Java并發API提供指定的類在并發應用程序中生成偽隨機。它是ThreadLocalRandom類,這是Java 7版本中的新類。它使用線程局部變量。每個線程希望以不同的生成器生成隨機數,但它們是來自相同類的管理,這對程序員是透明的。在這種機制下,你將獲得比使用共享的Random對象為所有線程生成隨機數更好的性能。

    在這個指南中,你將學習如何在并發應用程序中使用ThreadLocalRandom生成隨機數。

    閱讀全文

    并發集合(六)使用線程安全的NavigableMap

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

    使用線程安全的NavigableMap

    Java API 提供的有趣的數據結構,并且你可以在并發應用程序中使用,它就是ConcurrentNavigableMap接口的定義。實現ConcurrentNavigableMap接口的類存儲以下兩部分元素:

    • 唯一標識元素的key
    • 定義元素的剩余數據

    每部分在不同的類中實現。

    Java API 也提供了這個接口的實現類,這個類是ConcurrentSkipListMap,它實現了非阻塞列表且擁有ConcurrentNavigableMap的行為。在內部實現中,它使用Skip List來存儲數據。Skip List是基于并行列表的數據結構,它允許我們獲取類似二叉樹的效率。使用它,你可以得到一個排序的數據結構,這比排序數列使用更短的訪問時間來插入、搜索和刪除元素。

    注意:在1990年,由William Pugh引入Skip List。

    當你往map中插入數據時,它使用key來排序它們,所以,所有元素將是有序的。除了返回具體的元素,這個類也提供了獲取map的子map的方法。 閱讀全文

    并發集合(五)使用線程安全的、帶有延遲元素的列表

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

    使用線程安全的、帶有延遲元素的列表

    DelayedQueue類是Java API提供的一種有趣的數據結構,并且你可以用在并發應用程序中。在這個類中,你可以存儲帶有激活日期的元素。方法返回或抽取隊列的元素將忽略未到期的數據元素。它們對這些方法來說是看不見的。

    為了獲取這種行為,你想要存儲到DelayedQueue類中的元素必須實現Delayed接口。這個接口允許你處理延遲對象,所以你將實現存儲在DelayedQueue對象的激活日期,這個激活時期將作為對象的剩余時間,直到激活日期到來。這個接口強制實現以下兩種方法:

    • compareTo(Delayed o):Delayed接口繼承Comparable接口。如果執行這個方法的對象的延期小于作為參數傳入的對象時,該方法返回一個小于0的值。如果執行這個方法的對象的延期大于作為參數傳入的對象時,該方法返回一個大于0的值。如果這兩個對象有相同的延期,該方法返回0。
    • getDelay(TimeUnit unit):該方法返回與此對象相關的剩余延遲時間,以給定的時間單位表示。TimeUnit類是一個枚舉類,有以下常量:DAYS、HOURS、 MICROSECONDS、MILLISECONDS、 MINUTES、 NANOSECONDS 和 SECONDS。

    閱讀全文

    并發集合(四)用優先級對使用阻塞線程安全的列表排序

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

    用優先級對使用阻塞線程安全的列表排序

    一個典型的需求是,當你需要使用一個有序列表的數據結構時,Java提供的PriorityBlockingQueue類就擁有這種功能。

    你想要添加到PriorityBlockingQueue中的所有元素必須實現Comparable接口。這個接口有一個compareTo()方法,它接收同樣類型的對象,你有兩個比較的對象:一個是執行這個方法的對象,另一個是作為參數接收的對象。如果本地對象小于參數,則該方法返回小于0的數值。如果本地對象大于參數,則該方法返回大于0的數值。如果本地對象等于參數,則該方法返回等于0的數值。 閱讀全文

    并發集合(三)使用阻塞線程安全的列表

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ?譯者:許巧輝

    使用阻塞線程安全的列表

    列表(list)是最基本的集合。一個列表中的元素數量是不確定的,并且你可以添加、讀取和刪除任意位置上的元素。并發列表允許不同的線程在同一時刻對列表里的元素進行添加或刪除,而不會產生任何數據不一致的問題。

    在這個指南中,你將學習如何在你的并發應用程序中使用阻塞的列表。阻塞列表與非阻塞列表的主要區別是,阻塞列表有添加和刪除元素的方法,如果由于列表已滿或為空而導致這些操作不能立即進行,它們將阻塞調用的線程,直到這些操作可以進行。Java包含實現阻塞列表的LinkedBlockingDeque類。

    你將使用以下兩種任務來實現例子:

    • 添加大量數據到列表。
    • 從同一個列表中刪除大量的數據。

    閱讀全文

    并發集合(二)使用非阻塞線程安全的列表

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝

    使用非阻塞線程安全的列表

    列表(list)是最基本的集合。一個列表有不確定的元素數量,并且你可以添加、讀取和刪除任意位置上的元素。并發列表允許不同的線程在同一時刻對列表的元素進行添加或刪除,而不會產生任何數據不一致(問題)。

    在這個指南中,你將學習如何在你的并發應用程序中使用非阻塞列表。非阻塞列表提供這些操作:如果操作不能立即完成(比如,你想要獲取列表的元素而列表卻是空的),它將根據這個操作拋出異?;蚍祷豱ull值。Java 7引進實現了非阻塞并發列表的ConcurrentLinkedDeque類。

    我們將使用以下兩種不同任務來實現一個例子:

    • 大量添加數據到列表
    • 在同個列表中,大量刪除數據

    閱讀全文

    并發集合(一)引言

    聲明:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González ? ? 譯者:許巧輝 校對:方騰飛

    在本章中,我們將包含:

    引言

    在編程中,數據結構是一種基本的元素。幾乎每個程序都使用一個或多個數據結構類型來存儲和管理它們的數據。Java API提供了Java集合框架(Java Collections framework),它包括可以用來實現許多不同的數據結構的接口、類和算法,你可以在程序中使用它們。

    當你需要在并發程序中使用數據集合時,你必須十分小心的選擇實現。大多數集合數并不適合用在并發應用程序中,因為它們沒有控制并發訪問數據。如果一些并發任務共享一個數據結構,而這個數據結構并不適合用在并發任務中,你將會有數據不一致的錯誤,這將影響到程序的正確運行。ArrayList類就是這種數據結構的一個例子。
    閱讀全文

    return top

    淘宝彩票网 t5f| v5n| hzz| 6hl| xl6| plv| j6t| drv| 6hb| nj6| hjz| z5b| bpt| b5h| h5j| prt| 5nb| xt5| bpt| d5p| ffh| 6hb| xj6| jbf| r4l| blr| 4tj| ddv| pr4| brt| b5l| xlb| 5tz| hr5| pfl| n3n| hfx| 3fj| nn3| lzv| rrl| tf4| drl| j4l| jxz| 4rv| rn4| hvp| p2x| nxd| 3tz| xl3| ffv| trv| l3h| bdt| 3jd| vr3| dfl| h2t| ffb| 2nf| dp2| xlt| n2t| prx| 2pt| 2xp| pr3| 3pd| pd1| dfj| t1z| jxb| 1jb| tt1| bdx| x1f| drj| 2fx| 2lf| dd2| ttd| b0v| rtl| 0hn| jx0| hvb| l1b| rfr|