专栏首页Spring相关线程安全的Map的小Demo

线程安全的Map的小Demo

public class TempUser {

    private final ConcurrentHashMap<String, Future<String>> cache = new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, FutureTask<String>> taskCache = new ConcurrentHashMap<>();


    public String setUser(String name, String content) {

        while (true) {
            Future<String> f = cache.get(name);
            if (f == null) {

                Callable<String> callable = new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return content;
                    }
                };

                FutureTask<String> ft = new FutureTask<String>(callable);

                Future<String> stringFuture = cache.putIfAbsent(name, ft);

                //如果放入成功 返回null
                if(stringFuture==null){
                    f = ft;
                    ft.run();
                }

                try {
                    return f.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }


            }


        }


    }

    public int getSize(){

       return cache.size();
    }


    public String setUser02(String name, String content) {

        while (true) {
            FutureTask<String> ft = taskCache.get(name);
            if (ft == null) {

                Callable<String> callable = new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return content;
                    }
                };
                FutureTask<String> ft2 = new FutureTask<String>(callable);

                Future<String> stringFuture = cache.putIfAbsent(name, ft2);

                //如果放入成功 返回null
                if(stringFuture==null){
                    ft = ft2;
                    ft2.run();
                }

                try {
                    return ft.get();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }


            }


        }


    }



}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用Redis实现中英文自动补全功能详解

    ​ Redis可以帮我们实现很多种功能,今天这里着重介绍的是Redis的自动补全功能的实现.我们使用有序集合,并score都为0,这样就按元素值的字...

    Dream城堡
  • 同步容器与并发容器

    Vector、HashTable -- JDK提供的同步容器类 Collections.synchronizedXXX 本质是对相应的容器进行包装

    Dream城堡
  • oauth2.0实现sso单点登录的方式和相关代码

    百科:SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的...

    Dream城堡
  • 当我遵循了这 16 条规范写代码,同事只对我说了三个字: 666

    Many of the happiest people are those who own the least. But are we really so ha...

    良月柒
  • 这样规范写代码,同事直呼“666”

    zhisheng
  • Java性能优化之字符串优化处理

    String对象是java中重要的数据类型,在大部分情况下我们都会用到String对象。其实在Java语言中,其设计者也对String做了大量的优化工作,这些也...

    Java后端技术
  • 大数据算法设计模式(2) - 左外链接(leftOuterJoin) spark实现

    左外链接(leftOuterJoin) spark实现 package com.kangaroo.studio.algorithms.join; impor...

    用户1225216
  • Java做爬虫也很牛

    首先我们封装一个Http请求的工具类,用HttpURLConnection实现,当然你也可以用HttpClient, 或者直接用Jsoup来请求(下面会讲到Js...

    猿天地
  • java中两个map比较

    ydymz
  • 厉害了,关于String的10道经典面试题。

    1、String是基本数据类型吗? 2、String是可变的话? 3、怎么比较两个字符串的值一样,怎么比较两个字符串是否同一对象? 4、switch中可以使用S...

    Java技术栈

扫码关注云+社区

领取腾讯云代金券