ConcurrentHashMap

/**

  • A hash table supporting full concurrency of retrievals and
  • high expected concurrency for updates. This class obeys the
  • same functional specification as {@link java.util.Hashtable}, and
  • includes versions of methods corresponding to each method of
  • {@code Hashtable}. However, even though all operations are
  • thread-safe, retrieval operations do <em>not</em> entail locking,
  • and there is <em>not</em> any support for locking the entire table
  • in a way that prevents all access. This class is fully
  • interoperable with {@code Hashtable} in programs that rely on its
  • thread safety but not on its synchronization details.
  • <p>Retrieval operations (including {@code get}) generally do not
  • block, so may overlap with update operations (including {@code put}
  • and {@code remove}). Retrievals reflect the results of the most
  • recently <em>completed</em> update operations holding upon their
  • onset. (More formally, an update operation for a given key bears a
  • <em>happens-before</em> relation with any (non-null) retrieval for
  • that key reporting the updated value.) For aggregate operations
  • such as {@code putAll} and {@code clear}, concurrent retrievals may
  • reflect insertion or removal of only some entries. Similarly,
  • Iterators, Spliterators and Enumerations return elements reflecting the
  • state of the hash table at some point at or since the creation of the
  • iterator/enumeration. They do <em>not</em> throw {@link
  • java.util.ConcurrentModificationException ConcurrentModificationException}.
  • However, iterators are designed to be used by only one thread at a time.
  • Bear in mind that the results of aggregate status methods including
  • {@code size}, {@code isEmpty}, and {@code containsValue} are typically
  • useful only when a map is not undergoing concurrent updates in other threads.
  • Otherwise the results of these methods reflect transient states
  • that may be adequate for monitoring or estimation purposes, but not
  • for program control.
  • <p>The table is dynamically expanded when there are too many
  • collisions (i.e., keys that have distinct hash codes but fall into
  • the same slot modulo the table size), with the expected average
  • effect of maintaining roughly two bins per mapping (corresponding
  • to a 0.75 load factor threshold for resizing). There may be much
  • variance around this average as mappings are added and removed, but
  • overall, this maintains a commonly accepted time/space tradeoff for
  • hash tables. However, resizing this or any other kind of hash
  • table may be a relatively slow operation. When possible, it is a
  • good idea to provide a size estimate as an optional {@code
  • initialCapacity} constructor argument. An additional optional
  • {@code loadFactor} constructor argument provides a further means of
  • customizing initial table capacity by specifying the table density
  • to be used in calculating the amount of space to allocate for the
  • given number of elements. Also, for compatibility with previous
  • versions of this class, constructors may optionally specify an
  • expected {@code concurrencyLevel} as an additional hint for
  • internal sizing. Note that using many keys with exactly the same
  • {@code hashCode()} is a sure way to slow down performance of any
  • hash table. To ameliorate impact, when keys are {@link Comparable},
  • this class may use comparison order among keys to help break ties.
  • <p>A {@link Set} projection of a ConcurrentHashMap may be created
  • (using {@link #newKeySet()} or {@link #newKeySet(int)}), or viewed
  • (using {@link #keySet(Object)} when only keys are of interest, and the
  • mapped values are (perhaps transiently) not used or all take the
  • same mapping value.
  • <p>A ConcurrentHashMap can be used as scalable frequency map (a
  • form of histogram or multiset) by using {@link
  • java.util.concurrent.atomic.LongAdder} values and initializing via
  • {@link #computeIfAbsent computeIfAbsent}. For example, to add a count
  • to a {@code ConcurrentHashMap<String,LongAdder> freqs}, you can use
  • {@code freqs.computeIfAbsent(k -> new LongAdder()).increment();}
  • <p>This class and its views and iterators implement all of the
  • <em>optional</em> methods of the {@link Map} and {@link Iterator}
  • interfaces.
  • <p>Like {@link Hashtable} but unlike {@link HashMap}, this class
  • does <em>not</em> allow {@code null} to be used as a key or value.
  • <p>ConcurrentHashMaps support a set of sequential and parallel bulk
  • operations that, unlike most {@link Stream} methods, are designed
  • to be safely, and often sensibly, applied even with maps that are
  • being concurrently updated by other threads; for example, when
  • computing a snapshot summary of the values in a shared registry.
  • There are three kinds of operation, each with four forms, accepting
  • functions with Keys, Values, Entries, and (Key, Value) arguments
  • and/or return values. Because the elements of a ConcurrentHashMap
  • are not ordered in any particular way, and may be processed in
  • different orders in different parallel executions, the correctness
  • of supplied functions should not depend on any ordering, or on any
  • other objects or values that may transiently change while
  • computation is in progress; and except for forEach actions, should
  • ideally be side-effect-free. Bulk operations on {@link java.util.Map.Entry}
  • objects do not support method {@code setValue}.
  • <ul>
  • <li> forEach: Perform a given action on each element.
  • A variant form applies a given transformation on each element
  • before performing the action.</li>
  • <li> search: Return the first available non-null result of
  • applying a given function on each element; skipping further
  • search when a result is found.</li>
  • <li> reduce: Accumulate each element. The supplied reduction
  • function cannot rely on ordering (more formally, it should be
  • both associative and commutative). There are five variants:
  • <ul>
  • <li> Plain reductions. (There is not a form of this method for
  • (key, value) function arguments since there is no corresponding
  • return type.)</li>
  • <li> Mapped reductions that accumulate the results of a given
  • function applied to each element.</li>
  • <li> Reductions to scalar doubles, longs, and ints, using a
  • given basis value.</li>
  • </ul>
  • </li>
  • </ul>
  • <p>These bulk operations accept a {@code parallelismThreshold}
  • argument. Methods proceed sequentially if the current map size is
  • estimated to be less than the given threshold. Using a value of
  • {@code Long.MAX_VALUE} suppresses all parallelism. Using a value
  • of {@code 1} results in maximal parallelism by partitioning into
  • enough subtasks to fully utilize the {@link
  • ForkJoinPool#commonPool()} that is used for all parallel
  • computations. Normally, you would initially choose one of these
  • extreme values, and then measure performance of using in-between
  • values that trade off overhead versus throughput.
  • <p>The concurrency properties of bulk operations follow
  • from those of ConcurrentHashMap: Any non-null result returned
  • from {@code get(key)} and related access methods bears a
  • happens-before relation with the associated insertion or
  • update. The result of any bulk operation reflects the
  • composition of these per-element relations (but is not
  • necessarily atomic with respect to the map as a whole unless it
  • is somehow known to be quiescent). Conversely, because keys
  • and values in the map are never null, null serves as a reliable
  • atomic indicator of the current lack of any result. To
  • maintain this property, null serves as an implicit basis for
  • all non-scalar reduction operations. For the double, long, and
  • int versions, the basis should be one that, when combined with
  • any other value, returns that other value (more formally, it
  • should be the identity element for the reduction). Most common
  • reductions have these properties; for example, computing a sum
  • with basis 0 or a minimum with basis MAX_VALUE.
  • <p>Search and transformation functions provided as arguments
  • should similarly return null to indicate the lack of any result
  • (in which case it is not used). In the case of mapped
  • reductions, this also enables transformations to serve as
  • filters, returning null (or, in the case of primitive
  • specializations, the identity basis) if the element should not
  • be combined. You can create compound transformations and
  • filterings by composing them yourself under this "null means
  • there is nothing there now" rule before using them in search or
  • reduce operations.
  • <p>Methods accepting and/or returning Entry arguments maintain
  • key-value associations. They may be useful for example when
  • finding the key for the greatest value. Note that "plain" Entry
  • arguments can be supplied using {@code new
  • AbstractMap.SimpleEntry(k,v)}.
  • <p>Bulk operations may complete abruptly, throwing an
  • exception encountered in the application of a supplied
  • function. Bear in mind when handling such exceptions that other
  • concurrently executing functions could also have thrown
  • exceptions, or would have done so if the first exception had
  • not occurred.
  • <p>Speedups for parallel compared to sequential forms are common
  • but not guaranteed. Parallel operations involving brief functions
  • on small maps may execute more slowly than sequential forms if the
  • underlying work to parallelize the computation is more expensive
  • than the computation itself. Similarly, parallelization may not
  • lead to much actual parallelism if all processors are busy
  • performing unrelated tasks.
  • <p>All arguments to all task methods must be non-null.
  • <p>This class is a member of the
  • <a href="{@docRoot}/../technotes/guides/collections/index.html">
  • Java Collections Framework</a>.
  • @since 1.5
  • @author Doug Lea
  • @param <K> the type of keys maintained by this map
  • @param <V> the type of mapped values
    */
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容