美文网首页
putIfAbsent 灵活运用

putIfAbsent 灵活运用

作者: jackson_cai | 来源:发表于2018-06-06 18:06 被阅读0次

使用场景

同一个方法只能允许同一个用户进入一次,只有运行完了之后,再允许进入。

不过是多台机器,此方式不适合,要使用分布式锁,比如使用zookeeper进行实现

测试类如下:

import org.apache.commons.lang3.RandomStringUtils;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.CountDownLatch;

/**

* Created by cailu on 2018/6/6.

*/

public class Test{

    public static final ConcurrentHashMap cache = new ConcurrentHashMap();

    public static void main(String[] args) throws InterruptedException {

        CountDownLatch start = new CountDownLatch(1);

        CountDownLatch stop = new CountDownLatch(10);

        for (int i = 0; i < 10; i++) {

            RunThread runThread = new RunThread(RandomStringUtils.random(1, "ABC"), start, stop);

            Thread thread = new Thread(runThread);

            thread.start();

        }

        start.countDown();

        stop.await();

        System.out.println("全部运行完毕");

    }

    static class RunThread implements Runnable {

        private String userid;

        private CountDownLatch start;

        private CountDownLatch stop;

        public RunThread(String userid, CountDownLatch start, CountDownLatch stop) {

            this.userid = userid;

            this.start = start;

            this.stop = stop;

        }

        public void run() {

            try {

                start.await();

                RunMethod.method(userid);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }finally {

                stop.countDown();

            }

        }

    }

    static class RunMethod{

        public static void method(String userid) {

            Integer key = cache.putIfAbsent(userid, 1);

            if (key != null) {

                System.out.println(userid + "|操作频繁,稍后重试");

                return;

            }

            try {

                System.out.println(userid+"|运行开始");

                try {

                    Thread.sleep(1*100);

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }

                System.out.println(userid+"|运行结束");

            } catch (Exception e) {

                e.printStackTrace();

            }finally {

                cache.remove(userid);

            }

        }

    }

}

测试结果如下:

B|运行开始

C|运行开始

B|操作频繁,稍后重试

A|运行开始

B|操作频繁,稍后重试

B|操作频繁,稍后重试

C|操作频繁,稍后重试

A|操作频繁,稍后重试

C|操作频繁,稍后重试

B|操作频繁,稍后重试

C|运行结束

B|运行结束

A|运行结束

全部运行完毕

相关文章

  • putIfAbsent 灵活运用

    使用场景 同一个方法只能允许同一个用户进入一次,只有运行完了之后,再允许进入。 不过是多台机器,此方式不适合,要使...

  • Java8 Map常用三个方法

    Map 的 getOrDefault(),putIfAbsent() 和 computeIfAbsent() 三个...

  • java8中map新增方法详解

    map新增的方法: getOrDefault forEach putIfAbsent compute comput...

  • ConcurrentHashMap computeIfAbsen

    computeIfAbsent 和 putIfAbsent 区别有三点: 当 Key 存在的时候,如果 Value...

  • Map 的 getOrDefault(),putIfAbsent

    假设我们定义下面一个 Map: Map > map = new HashMap<>();如果我们要放一个元素进去,...

  • ConcurrentHashMap的putIfAbsent方法可

    背景 ConcurrentHashMap是一个线程安全的Map,正因为它是线程安全的Map所以在使用时不注意也很可...

  • Java HashMap 新增方法(merge,compute)

    Java8 Map里新增了几个方法,很多同学不知道具体功能是啥。 先从最简单的开始。 putIfAbsent() ...

  • 2018.1.6 和千喜的晚餐

    东哥分享: 1.保险的钱要灵活运用,可以贷款很方便,掌握好时间,灵活运用每一笔资源。 2.灵活运用滴滴打车,给客户...

  • 灵活运用

    中原焦点团队张红,持续分享1963天,2023年1月12日 没有一个催眠理论模型,足以能完全理解催眠。 当你继续更...

  • 用感知位置平衡探索自己

    【学习内容】 感知位置平衡的灵活运用 用感知位置平衡探索自己 【我的收获】 一、感知位置平衡的灵活运用 1、感知心...

网友评论

      本文标题:putIfAbsent 灵活运用

      本文链接:https://www.haomeiwen.com/subject/tahisftx.html