天天看点

google collection工具包的MapMaker使用

摘自网上描述语段:

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&lt;string , string&gt; 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&lt;string, string&gt;() {</code>

<code>                            </code><code>public</code> <code>string apply(string s) {</code>

<code>                                </code><code>return</code> <code>"creating "</code> <code>+ s +</code><code>" -&gt; 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 -&gt; object</code>

<code>creating a -&gt; object</code>

<code>creating b -&gt; object</code>

二、先看下其api的相关demo片段:

<code>// 使用案例:存储验证码</code>

<code>    </code><code>// &lt;string, string&gt; == &lt;用户唯一,验证码&gt;</code>

<code>    </code><code>// expiration(15, timeunit.minutes) 有效期15分钟</code>

<code>    </code><code>concurrentmap&lt;string,string&gt; 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&lt;string,object&gt; map1 =</code><code>new</code> <code>mapmaker().concurrencylevel(8).makemap();</code>

<code>    </code><code>// 构造各种不同reference作为key和value的map</code>

<code>    </code><code>concurrentmap&lt;string,object&gt; map2 =</code><code>new</code> <code>mapmaker().softkeys().weakvalues().makemap();</code>

<code>    </code><code>// 提供当map里面不包含所get的项,可以自动加入到map的功能</code>

<code>    </code><code>concurrentmap&lt;string,integer&gt; map3 =</code><code>new</code> <code>mapmaker()</code>

<code>            </code><code>.makecomputingmap(</code>

<code>                    </code><code>new</code> <code>function&lt;string, integer&gt;() {</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秒后,缓存失效,所以呈现如此结果。