ConcurrentHashMap的putIfAbsent

这个方法在key不存在的时候加入一个值,如果key存在就不放入,等价:

   if (!map.containsKey(key))
      return map.put(key, value);
  else
       return map.get(key);

测试代码:

public class Test {
    public static void main(String[] args) {
        ConcurrentHashMap<String,String> map=new ConcurrentHashMap<String,String>();
        String temp=map.putIfAbsent("a", "gaoxing");
        System.out.println(map.get("a"));
        temp=map.putIfAbsent("a","nihao");
        System.out.println(map.get("a"));
        temp=map.putIfAbsent("a","gaoxing");
        System.out.println(map.get("a"));
    }
}

结果为

gaoxing
gaoxing
gaoxing

ConcurrentHashMap的putIfAbsent用来做缓冲相当不错,多线程安全的
时间: 2024-11-13 06:36:32

ConcurrentHashMap的putIfAbsent的相关文章

ConcurrentHashMap 中putIfAbsent 和put的区别

putIfAbsent 源代码 public V putIfAbsent(K key, V value) { Segment<K,V> s; if (value == null) throw new NullPointerException(); int hash = hash(key); int j = (hash >>> segmentShift) & segmentMask; if ((s = (Segment<K,V>)UNSAFE.getObje

七、并发容器ConcurrentHashMap

一.简介 我们知道,HashMap是线程不安全的.而HashTable是线程安全的,但是JDK已经不建议使用HashTable,它已经被作为废除的实现. 在JDK并发包里面,ConcurrentHashMap支持并发操作,并包括HashMap的方法. JDK文档:http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/concurrent/ConcurrentHashMap.html 二.示例 以下示例,我们使用CountDownLatc

如何编写一个有效的缓存

缓存作为计算机历史上最重要的发明之一,对计算机历史起到了举足轻重的作用,因为缓存可以协调两个速度不一致的组件之间的并行运作.内存作为CPU和非易失性存储介质之间的缓存,避免CPU每次读取指令,读取数据都去速度缓慢的硬盘读取.快速缓存作为内存和CPU之间的缓存进一步提高了CPU的效率,现在大部分CPU都支持指令预取,CPU会预测后面要执行的指令预取到快速缓存中.而我们平时也直接或间接地会用到缓存技术,那如果要自己实现一个线程安全的缓存,要注意哪些问题呢?我们一步步来探讨这个问题. 假设我们提供一个

Struts2中的缓存----以Injector为例

题外话,文章中有大量的标识1 标识2,大家可以用ctrl+f来查找. 构成缓存的类 主要就是以下两个: com.opensymphony.xwork2.inject.util.ReferenceCache<K, V> com.opensymphony.xwork2.inject.util.ReferenceMap<K, V> 前者继承自后者. 我们先看看ReferenceMap public class ReferenceMap<K, V> implements Map

如何实现一个缓存服务

场景:我们对于需要大量计算的场景,希望将结果缓存起来,然后我们一起来实现一个缓存服务.即对于一个相同的输入,它的输出是不变的(也可以短时间不变). 实现说明:这里实现采用GuavaCache+装饰器模式. 首先设计一个缓存服务接口. public interface CacheableService<I, O> { /** * 计算服务 * @param i * @return * @throws Exception */ O doService(I i) throws Exception;

并行类加载与OSGI类加载

这回来分析一下OSGI的类加载机制. 先说一下OSGI能解决什么问题吧. 记得在上家公司的时候,经常参与上线.上线一般都是增加了一些功能或者修改了一些功能,然后将所有的代码重新部署.过程中要将之前的服务关掉,而且不能让客户访问.虽然每回的夜宵都不错,但还是感觉这个过程很麻烦,很别扭. 为什么明明只修改了一部分代码,却都要重新来一遍. OSGI架构里面,很重要的一个理念就是分模块(bundle).如果你只是修改了一个模块,就可以只热替换这个模块,不影响其它模块.想想就很有吸引力.要实现这种功能,类

Spark源码分析之五:Task调度(一)

在前四篇博文中,我们分析了Job提交运行总流程的第一阶段Stage划分与提交,它又被细化为三个分阶段: 1.Job的调度模型与运行反馈: 2.Stage划分: 3.Stage提交:对应TaskSet的生成. Stage划分与提交阶段主要是由DAGScheduler完成的,而DAGScheduler负责Job的逻辑调度,主要职责也即DAG图的分解,按照RDD间是否为shuffle dependency,将整个Job划分为一个个stage,并将每个stage转化为tasks的集合--TaskSet.

ConcurrentHashMap putIfAbsent和的put区别

putIfAbsent: 当key不存在的时候调用put方法将key存入进map 当key存在的时候相当于return map.get(key)   public static void main(String[] args) {         ConcurrentHashMap map = new ConcurrentHashMap();         Object o = map.putIfAbsent("aaa", "bbb");         Syst

【转】ConcurrentHashMap完全解析(JDK6/7、JDK8)

转自http://my.oschina.net/hosee/blog/675884 并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O).ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,final,CAS