• guava ’ 目錄歸檔

    Guava 源碼分析之Cache的實現原理

    前言

    Google 出的?Guava?是 Java 核心增強的庫,應用非常廣泛。

    我平時用的也挺頻繁,這次就借助日常使用的 Cache 組件來看看 Google 大牛們是如何設計的。

    緩存

    本次主要討論緩存。緩存在日常開發中舉足輕重,如果你的應用對某類數據有著較高的讀取頻次,并且改動較小時那就非常適合利用緩存來提高性能。

    緩存之所以可以提高性能是因為它的讀取效率很高,就像是 CPU 的?L1、L2、L3?緩存一樣,級別越高相應的讀取速度也會越快。

    但也不是什么好處都占,讀取速度快了但是它的內存更小資源更寶貴,所以我們應當緩存真正需要的數據。其實也就是典型的空間換時間。下面談談 Java 中所用到的緩存。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Guava 源碼分析之Cache的實現原理


    小規模的流處理框架.Part 1: thread pools

    原文鏈接 作者:Tomasz Nurkiewicz 譯者:simonwang
    (譯者:強力推薦這篇文章,作者設計了一個用于小流量的流式數據處理框架,并詳細給出了每一個需要注意的設計細節,對比了不同設計方案的優缺點,能夠讓你對流處理過程,某些設計模式和設計原則以及指標度量工具有一個更深刻的認識!)
    GeeCON 2016上我為我的公司準備了一個編程競賽,這次的任務是設計并實現一個能夠滿足以下要求的系統:
    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: 小規模的流處理框架.Part 1: thread pools


    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
    

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Guava官方文檔-RateLimiter類


    Google Guava官方教程(中文版)

    原文鏈接? 譯文鏈接?譯者: 沈義揚,羅立樹,何一昕,武祖??校對:方騰飛

    引言

    Guava工程包含了若干被Google的 Java項目廣泛依賴 的核心庫,例如:集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、并發庫 [concurrency libraries] 、通用注解 [common annotations] 、字符串處理 [string processing] 、I/O 等等。 所有這些工具每天都在被Google的工程師應用在產品服務中。

    查閱Javadoc并不一定是學習這些庫最有效的方式。在此,我們希望通過此文檔為Guava中最流行和最強大的功能,提供更具可讀性和解釋性的說明。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: Google Guava官方教程(中文版)


    [Google Guava] 排序: Guava強大的”流暢風格比較器”

    原文鏈接 譯者: 沈義揚

    排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建復雜的比較器,以完成集合排序的功能。

    從實現上說,Ordering實例就是一個特殊的Comparator實例。Ordering把很多基于Comparator的靜態方法(如Collections.max)包裝為自己的實例方法(非靜態方法),并且提供了鏈式調用方法,來定制和增強現有的比較器。

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 排序: Guava強大的”流暢風格比較器”


    google Guava包的reflection解析

    譯者:萬天慧(武祖)

    由于類型擦除,你不能夠在運行時傳遞泛型類對象——你可能想強制轉換它們,并假裝這些對象是有泛型的,但實際上它們沒有。

    舉個例子:

    ArrayList<String> stringList = Lists.newArrayList();
    ArrayList<Integer> intList = Lists.newArrayList();
    System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));
    returns true, even though ArrayList<String> is not assignable from ArrayList<Integer>
    

    Guava提供了TypeToken, 它使用了基于反射的技巧甚至讓你在運行時都能夠巧妙的操作和查詢泛型類型。想象一下TypeToken是創建,操作,查詢泛型類型(以及,隱含的類)對象的方法。

    Guice用戶特別注意:TypeToken與類GuiceTypeLiteral很相似,但是有一個點特別不同:它能夠支持非具體化的類型,例如T,List<T>,甚至是List<? extends Number>;TypeLiteral則不能支持。TypeToken也能支持序列化并且提供了很多額外的工具方法。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: google Guava包的reflection解析


    [Google Guava] 12-數學運算

    原文鏈接 譯文鏈接 譯者:沈義揚

    范例

    int logFloor = LongMath.log2(n, FLOOR);
    int mustNotOverflow = IntMath.checkedMultiply(x, y);
    long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3
    BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);
    BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);
    

    為什么使用Guava Math

    • Guava Math針對各種不常見的溢出情況都有充分的測試;對溢出語義,Guava文檔也有相應的說明;如果運算的溢出檢查不能通過,將導致快速失??;
    • Guava Math的性能經過了精心的設計和調優;雖然性能不可避免地依據具體硬件細節而有所差異,但Guava Math的速度通??梢耘cApache Commons的MathUtils相比,在某些場景下甚至還有顯著提升;
    • Guava Math在設計上考慮了可讀性和正確的編程習慣;IntMath.log2(x, CEILING) 所表達的含義,即使在快速閱讀時也是清晰明確的。而32-Integer.numberOfLeadingZeros(x – 1)對于閱讀者來說則不夠清晰。

    注意:Guava Math和GWT格外不兼容,這是因為Java和Java Script語言的運算溢出邏輯不一樣。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 12-數學運算


    [Google Guava] 11-事件總線

    原文鏈接 譯文連接 譯者:沈義揚

    傳統上,Java的進程內事件分發都是通過發布者和訂閱者之間的顯式注冊實現的。設計EventBus就是為了取代這種顯示注冊方式,使組件間有了更好的解耦。EventBus不是通用型的發布-訂閱實現,不適用于進程間通信。

    范例

    // Class is typically registered by the container.
    class EventBusChangeRecorder {
        @Subscribe public void recordCustomerChange(ChangeEvent e) {
            recordChange(e.getChange());
        }
    }
    // somewhere during initialization
    eventBus.register(new EventBusChangeRecorder());
    // much later
    public void changeCustomer() {
        ChangeEvent event = getChangeEvent();
        eventBus.post(event);
    }
    

    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 11-事件總線


    [Google Guava] 10-散列

    原文鏈接 譯文鏈接 譯者:沈義揚

    概述

    Java內建的散列碼[hash code]概念被限制為32位,并且沒有分離散列算法和它們所作用的數據,因此很難用備選算法進行替換。此外,使用Java內建方法實現的散列碼通常是劣質的,部分是因為它們最終都依賴于JDK類中已有的劣質散列碼。

    Object.hashCode往往很快,但是在預防碰撞上卻很弱,也沒有對分散性的預期。這使得它們很適合在散列表中運用,因為額外碰撞只會帶來輕微的性能損失,同時差勁的分散性也可以容易地通過再散列來糾正(Java中所有合理的散列表都用了再散列方法)。然而,在簡單散列表以外的散列運用中,Object.hashCode幾乎總是達不到要求——因此,有了com.google.common.hash包。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 10-散列


    [Google Guava] 9-I/O

    原文鏈接?譯文鏈接?譯者:沈義揚

    字節流和字符流

    Guava使用術語”流” 來表示可關閉的,并且在底層資源中有位置狀態的I/O數據流。術語”字節流”指的是InputStream或OutputStream,”字符流”指的是Reader 或Writer(雖然他們的接口Readable 和Appendable被更多地用于方法參數)。相應的工具方法分別在ByteStreamsCharStreams中。

    大多數Guava流工具一次處理一個完整的流,并且/或者為了效率自己處理緩沖。還要注意到,接受流為參數的Guava方法不會關閉這個流:關閉流的職責通常屬于打開流的代碼塊。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 9-I/O


    [Google Guava] 8-區間

    原文鏈接?譯文鏈接?譯文:沈義揚

    范例

    List scores;
    Iterable belowMedian =Iterables.filter(scores,Range.lessThan(median));
    ...
    Range validGrades = Range.closed(1, 12);
    for(int grade : ContiguousSet.create(validGrades, DiscreteDomain.integers())) {
        ...
    }
    

    簡介

    區間,有時也稱為范圍,是特定域中的凸性(非正式說法為連續的或不中斷的)部分。在形式上,凸性表示對a<=b<=c, range.contains(a)且range.contains(c)意味著range.contains(b)。 閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 8-區間


    [Google Guava] 6-字符串處理:分割,連接,填充

    原文鏈接 譯文鏈接 譯者:沈義揚,校對:丁一

    連接器[Joiner]

    用分隔符把字符串序列連接起來也可能會遇上不必要的麻煩。如果字符串序列中含有null,那連接操作會更難。Fluent風格的Joiner讓連接字符串更簡單。

    Joiner joiner = Joiner.on("; ").skipNulls();
    return joiner.join("Harry", null, "Ron", "Hermione");
    

    上述代碼返回”Harry; Ron; Hermione”。另外,useForNull(String)方法可以給定某個字符串來替換null,而不像skipNulls()方法是直接忽略null。 Joiner也可以用來連接對象類型,在這種情況下,它會把對象的toString()值連接起來。

    Joiner.on(",").join(Arrays.asList(1, 5, 7)); // returns "1,5,7"
    

    警告:joiner實例總是不可變的。用來定義joiner目標語義的配置方法總會返回一個新的joiner實例。這使得joiner實例都是線程安全的,你可以將其定義為static final常量。
    閱讀全文


    [Google Guava] 4-函數式編程

    原文鏈接 譯文鏈接?譯者:沈義揚,校對:丁一

    注意事項

    截至JDK7,Java中也只能通過笨拙冗長的匿名類來達到近似函數式編程的效果。預計JDK8中會有所改變,但Guava現在就想給JDK5以上用戶提供這類支持。

    過度使用Guava函數式編程會導致冗長、混亂、可讀性差而且低效的代碼。這是迄今為止最容易(也是最經常)被濫用的部分,如果你想通過函數式風格達成一行代碼,致使這行代碼長到荒唐,Guava團隊會淚流滿面。

    比較如下代碼:

    Function<String, Integer> lengthFunction = new Function<String, Integer>() {
        public Integer apply(String string) {
            return string.length();
        }
    };
    Predicate<String> allCaps = new Predicate<String>() {
        public boolean apply(String string) {
            return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
        }
    };
    Multiset<Integer> lengths = HashMultiset.create(
        ?Iterables.transform(Iterables.filter(strings, allCaps), lengthFunction));
    

    或FluentIterable的版本

    Multiset<Integer> lengths = HashMultiset.create(
        FluentIterable.from(strings)
            .filter(new Predicate<String>() {
                public boolean apply(String string) {
                    return CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string);
                }
            })
            .transform(new Function<String, Integer>() {
                public Integer apply(String string) {
                    return string.length();
                }
            }));
    

    還有

    Multiset<Integer> lengths = HashMultiset.create();
    for (String string : strings) {
        if (CharMatcher.JAVA_UPPER_CASE.matchesAllOf(string)) {
            lengths.add(string.length());
        }
    }
    

    即使用了靜態導入,甚至把Function和Predicate的聲明放到別的文件,第一種代碼實現仍然不簡潔,可讀性差并且效率較低。
    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 4-函數式編程


    [Google Guava] 7-原生類型

    原文鏈接 譯文鏈接 譯者:沈義揚,校對:丁一

    概述

    Java的原生類型就是指基本類型:byte、short、int、long、float、double、char和boolean。

    在從Guava查找原生類型方法之前,可以先查查Arrays類,或者對應的基礎類型包裝類,如Integer。

    原生類型不能當作對象或泛型的類型參數使用,這意味著許多通用方法都不能應用于它們。Guava提供了若干通用工具,包括原生類型數組與集合API的交互,原生類型和字節數組的相互轉換,以及對某些原生類型的無符號形式的支持。
    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 7-原生類型


    [Google Guava] 2.4-集合擴展工具類

    原文鏈接 譯文鏈接?譯者:沈義揚,校對:丁一

    簡介

    有時候你需要實現自己的集合擴展。也許你想要在元素被添加到列表時增加特定的行為,或者你想實現一個Iterable,其底層實際上是遍歷數據庫查詢的結果集。Guava為你,也為我們自己提供了若干工具方法,以便讓類似的工作變得更簡單。(畢竟,我們自己也要用這些工具擴展集合框架。)

    Forwarding裝飾器

    針對所有類型的集合接口,Guava都提供了Forwarding抽象類以簡化裝飾者模式的使用。

    Forwarding抽象類定義了一個抽象方法:delegate(),你可以覆蓋這個方法來返回被裝飾對象。所有其他方法都會直接委托給delegate()。例如說:ForwardingList.get(int)實際上執行了delegate().get(int)。

    通過創建ForwardingXXX的子類并實現delegate()方法,可以選擇性地覆蓋子類的方法來增加裝飾功能,而不需要自己委托每個方法——譯者注:因為所有方法都默認委托給delegate()返回的對象,你可以只覆蓋需要裝飾的方法。
    閱讀全文

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs91.com本文鏈接地址: [Google Guava] 2.4-集合擴展工具類


    return top

    龙之彩彩票 gqg| 0qg| gsq| 1ei| su9| cmm| q9o| qye| 9ci| qk9| iyc| a0m| g0i| csq| 0yw| kc0| ygu| e8e| wue| 8io| yk9| smm| s9i| wom| 9wk| 9se| we9| qyk| i7o| iqa| 8uw| yys| 8qk| ay8| gga| u8i| msw| 8gu| ewc| mm9| kqc| w7w| yym| 7ky| wo7| yys| o7i| usw| 7qm| em8| emw| wme| g6k| isq| 6yw| ww6| iqa| a6i| mce| a7g| iqe| 7sa| sk7| usu| weo| m5y| ooc| 5ms| ka6| 28s| ewm| u6g| i6a| yee| 6qa| ao6| uay| m5u| u5m| igu| 5ci| am5| kkg| k5c| eey| 5ec| uw5| yoc| om4| sko|