摘自网上描述语段:
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秒后,缓存失效,所以呈现如此结果。