摘自網上描述語段:
google collections中的mapmaker融合了weak reference,線程安全,高并發性能,異步逾時清理,自定義建構元素等強大功能于一身。
常閱讀優秀源代碼的童鞋都知道,一般叫maker的對象都是builder模式,而這個mapmaker就是來”build“map的.
一、google collection工具包的mapmaker使用:
<a href="http://www.bysocket.com/?p=834#">?</a>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<code>public</code> <code>static</code> <code>void</code> <code>main(string[] args) {</code>
<code> </code><code>/**</code>
<code> </code><code>* expiration(3, timeunit.seconds)設定逾時時間為3秒</code>
<code> </code><code>*/</code>
<code> </code><code>concurrentmap<string , string> map =</code><code>new</code> <code>mapmaker().concurrencylevel(32).softkeys().weakvalues()</code>
<code> </code><code>.expiration(3, timeunit.seconds).makecomputingmap(</code>
<code> </code><code>/**</code>
<code> </code><code>* 提供當map裡面不包含所get的項,可以自動加入到map的功能</code>
<code> </code><code>* 可以将這裡的傳回值放到對應的key的value中</code>
<code> </code><code>*/</code>
<code> </code><code>new</code> <code>function<string, string>() {</code>
<code> </code><code>public</code> <code>string apply(string s) {</code>
<code> </code><code>return</code> <code>"creating "</code> <code>+ s +</code><code>" -> object"</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>);</code>
<code> </code><code>map.put(</code><code>"a"</code><code>,</code><code>"testa"</code><code>);</code>
<code> </code><code>map.put(</code><code>"b"</code><code>,</code><code>"testb"</code><code>);</code>
<code> </code><code>system.</code><code>out</code><code>.println(map.</code><code>get</code><code>(</code><code>"a"</code><code>));</code>
<code> </code><code>system.</code><code>out</code><code>.println(map.</code><code>get</code><code>(</code><code>"b"</code><code>));</code>
<code> </code><code>system.</code><code>out</code><code>.println(map.</code><code>get</code><code>(</code><code>"c"</code><code>));</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>// 4秒後,大于逾時時間,緩存失效。</code>
<code> </code><code>thread.sleep(4000);</code>
<code> </code><code>}</code><code>catch</code> <code>(interruptedexception e) {</code>
<code> </code><code>e.printstacktrace();</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
結果如下:
<code>testa</code>
<code>testb</code>
<code>creating c -> object</code>
<code>creating a -> object</code>
<code>creating b -> object</code>
二、先看下其api的相關demo片段:
<code>// 使用案例:存儲驗證碼</code>
<code> </code><code>// <string, string> == <使用者唯一,驗證碼></code>
<code> </code><code>// expiration(15, timeunit.minutes) 有效期15分鐘</code>
<code> </code><code>concurrentmap<string,string> capthcamap =</code><code>new</code> <code>mapmaker().expiration(15, timeunit.minutes).makemap();</code>
<code> </code><code>// 設定concurrentmap的concurrencylevel參數 ,例如concurrenthashmap是用來控制其segment數組的大小</code>
<code> </code><code>concurrentmap<string,object> map1 =</code><code>new</code> <code>mapmaker().concurrencylevel(8).makemap();</code>
<code> </code><code>// 構造各種不同reference作為key和value的map</code>
<code> </code><code>concurrentmap<string,object> map2 =</code><code>new</code> <code>mapmaker().softkeys().weakvalues().makemap();</code>
<code> </code><code>// 提供當map裡面不包含所get的項,可以自動加入到map的功能</code>
<code> </code><code>concurrentmap<string,integer> map3 =</code><code>new</code> <code>mapmaker()</code>
<code> </code><code>.makecomputingmap(</code>
<code> </code><code>new</code> <code>function<string, integer>() {</code>
<code> </code><code>public</code> <code>integer apply(string key) {</code>
<code> </code><code>return</code> <code>1;</code>
<code> </code><code>}</code>
<code> </code><code>);</code>
可以看出過了4秒後,緩存失效,是以呈現如此結果。