Java并发包:ConcurrentMap

来源:互联网 发布:网络摄像头怎么接线 编辑:程序博客网 时间:2024/04/30 09:32
转自请注明出处。 

http://blog.csdn.net/zxc123e/article/details/51862756

ConcurrentMap

Java.util.concurrent.ConcurrentMap接口代表一个Map,它可以处理并发访问。ConcurrentMap除了继承自java.util.Map的方法,还有一些自己的原子方法。

ConcurrentMap的具体实现

由于ConcurrentMap是一个接口类,使用时需要使用它的实现类。Java.util.concurrent包中有下面关于ConcurrentMap接口的实现类。

  • ConcurrentHashMap

ConcurrentHashMap

ConcurrentHashMap除了有更好的并行性,它与java.util.HashTable类时非常相似的。当你从ConcurrentHashMap读取数据的时候ConcurrentHashMap是不会加锁的。另外,ConcurrenthashMap在写的时候不会全部加锁。它仅仅锁住Map中正在被写入的部分。

ConcurrentHashMap的另一个不同之处是,如果在迭代的时候ConcurrentHashMap被修改了,ConcurrentHashMap是不会抛出ConcurrentModificationException异常的。迭代器不能被超过一个以上的线程使用。

查看官方文档获取ConcurrentMap和ConcurrentHashMap更详细的信息。

ConcurrentMap实例

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">ConcurrentMap concurrentMap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentHashMap();concurrentMap.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"key"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"value"</span>);Object <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">value</span> = concurrentMap.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">get</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"key"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

ConcurrentNavigableMap

java.util.concurrent.ConcurrentNavgableMap接口类是一种支持并行访问的java.util.NavigableMap,并且它的子map也支持并行访问,子map是通过headMap(),subMap()和tailMap()等方法返回的。

这里不重新解释NavigableMap中已有的相同方法,我们仅看看在ConcurrentNavigableMap中增加的一些方法。

haedMap()

headMap(T toKey) 返回一个包含许多键的map,其中所有键值是严格少于给定的toKey。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了headMap()方法的使用。

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">ConcurrentNavigableMap <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentSkipListMap();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"one"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"two"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"3"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"three"</span>);ConcurrentNavigableMap headMap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.headMap(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

headMap将会指向一个仅仅包含key为“1”的ConcurrentNavigableMap,因为只有这个key是严格小于“2”的。ConcurrentSkipListMap是ConcurrentNavigableMap的实现类。

查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

tailMap()

tailMap(T fromKey)返回一个包含许多键的map,其中所有键值是大于或者等于给定的fromKey的。

如果你改变了原始的map,这些改变也会反映到head map上。

下面的例子说明了tailMap()方法的使用。

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">ConcurrentNavigableMap <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentSkipListMap();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"one"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"two"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"3"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"three"</span>);ConcurrentNavigableMap tailMap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.tailMap(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

tailMap将包含“2”、“3”两个键,因为这两个键是大于或者等于给定的键值“2”。 
查看JavaDoc了解这个方法以及它的重载版本更详细的执行情况。

subMap()

subMap()方法返回一个包含许多键的map,这些键值是介于传给该方法的(including)和(excluding)两个参数之间的,下面是一个例子:

<code class="hljs vhdl has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">ConcurrentNavigableMap <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ConcurrentSkipListMap();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"one"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"two"</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.put(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"3"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"three"</span>);ConcurrentNavigableMap subMap = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">map</span>.subMap(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"3"</span>);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="box-sizing: border-box; position: absolute; height: 60px; right: 30px; top: 5px; color: rgb(255, 255, 255); cursor: pointer; z-index: 2;"><a target=_blank style="color: rgb(202, 0, 0); box-sizing: border-box;"><img src="http://static.blog.csdn.net/images/save_snippets.png" style="border: none; box-sizing: border-box; max-width: 100%;" alt="" /></a></div><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

方法返回的subMap仅包含一个key等于“2”的键值对,因为只有这个键是大于或等“2”,并且小于“3”的。

更多方法

ConcurrentNavigableMap接口还包含跟多的一些方法也许会用到的,例如:

  • descendingKeySet()
  • descendingMap()
  • navigableKeySet()

更多信息请查看官方JavaDoc

0 0
原创粉丝点击