栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java.util.concurrent.ConcurrentHashMap 详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java.util.concurrent.ConcurrentHashMap 详解

ConcurrentHashMap

ConcurrentHashMap使用的是分段锁技术,将ConcurrentHashMap将锁一段一段的存储,然后给每一段数据配一把锁(segment),当一个线程占用一把锁(segment)访问其中一段数据的时候,其他段的数据也能被其它的线程访问,默认分配16个segment。默认比Hashtable效率提高16倍。

ConcurrentHashMap是Map的一种并发实现,在该类中元素的read操作都是无锁了,而write操作需要被同步。这非常适合于读操作远大于写操作的情况。在实现过程中,ConcurrentHashMap将所有元素分成了若干个segment,每个segment是独立的,在一个segment上加锁并不影响其他segment的操作。segment本身是一个hashtable,对于一个加入ConcurrentHashMap的对,key的hash值中的高位被用来索引segment,而低位用于segment中的索引。

scala> import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.ConcurrentHashMap

scala> val m=new ConcurrentHashMap[String, String]()
val m: java.util.concurrent.ConcurrentHashMap[String,String] = {}

scala> m.isEmpty
val res2: Boolean = true

scala> m.
!=(           (universal)   equals(                     notify()      (universal)   reducevalues(                                      ##            (universal)   forEach(                    notifyAll()   (universal)   reducevaluesToDouble(                              +(           (deprecated)   forEachEntry(               put(                        reducevaluesToInt(                                 ->(           (universal)   forEachKey(                 putAll(                     reducevaluesToLong(                                ==(           (universal)   forEachValue(               putIfAbsent(                remove(                                            asInstanceOf  (universal)   formatted(    (universal)   reduce(                     replace(                                           clear()                     get(                        reduceEntries(              replaceAll(                                        compute(                    getClass()    (universal)   reduceEntriesToDouble(      search(                                            computeIfAbsent(            getOrDefault(               reduceEntriesToInt(         searchEntries(                                     computeIfPresent(           hashCode()                  reduceEntriesToLong(        searchKeys(                                        contains(                   isEmpty()                   reduceKeys(                 searchValues(                                      containsKey(                isInstanceOf  (universal)   reduceKeysToDouble(         size()                                             containsValue(              keySet()                    reduceKeysToInt(            synchronized( (universal)                          elements()                  keys()                      reduceKeysToLong(           toString()                                         ensuring(     (universal)   mappingCount()              reduceToDouble(             values()                                           entrySet()                  merge(                      reduceToInt(                wait(         (universal)                          eq(           (universal)   ne(           (universal)   reduceToLong(               →( 
重要方法 isEmpty

是否为空 clear

清空所有key get(“key”)

得到某个key的value contains(“key”)

某个key是否存在

scala> m.contains("a")
val res18: Boolean = false

scala> m.contains("b")
val res19: Boolean = false

remove

移除某个key

compute

key不存在添加,存在则对value进行操作

private val REGISTERED_PRODUCER_INSTANCES = new ConcurrentHashMap[String, KafkaProducer[String, String]]()

def registerProducer(topic: String, properties: Properties): Unit = {
    REGISTERED_PRODUCER_INSTANCES.computeIfAbsent(topic, new java.util.function.Function[String, KafkaProducer[String, String]]() {
      override def apply(t: String): KafkaProducer[String, String] = {
        val client = new KafkaProducer[String, String](properties)
        logger.info(s"finish init kafka producer client: topic = $topic, properties = $properties")
        client
      }
    })
  }
computeIfAbsent

当key存在返回当前value值,不存在则添加 computeIfPresent

对在map中已有key的value进行操作 put(k,v)

设置某个key

scala> m.put("a","a-v")
val res6: String = null

scala> m.put("a","a-v1")
val res7: String = a-v

putIfabsent

如果传入key对应的value已经存在,就返回存在的value,不进行替换。如果不存在,就添加key和value,返回null

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/731640.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号