zoukankan      html  css  js  c++  java
  • 多线程并发安全计数器实现限流(二) 使用 J.U.C中的AtomicInteger实现计数器

     一、使用 J.U.C中的 atomicInteger 实现计数器

            由于(一)中的计数器不能保证并发安全,因此需要改一下;

           思路:使用 J.U.C中的 AtomicInteger 实现计数器

    二、实现

    public class CounterAtomic implements Counter {
    
        // JUC包 针对基本数据类型 --- 原子操作
        AtomicInteger i = new AtomicInteger(0); // 本质是修改内存中某一个变量的值
    
        public int incr() {
            return i.incrementAndGet();
        }
    
        public int decr() {
            return i.decrementAndGet();
        }
    
        @Override
        public int get() {
            return i.get();
        }
    }
    

       

    测试代码

        public static void main(String[] args) throws InterruptedException {
            final Counter ct = new CounterAtomic();
    
            //模拟多线程场景
            CountDownLatch countDownLatch = new CountDownLatch(2);
    
            for (int i = 0; i < 2; i++) {
                new Thread(() -> {
                    long begin = System.nanoTime();
                    for (int j = 0; j < 10000; j++) {
                        ct.incr();
                    }
                    System.out.println("done...运算时间: " + (System.nanoTime() - begin));
                    countDownLatch.countDown();
                }).start();
            }
    
            countDownLatch.await();
            System.out.println("计数器最终结果: " + ct.get());
            // 预期结果应该 --- 20000
        }
    

      

    打印结果, 符合预期

    done...运算时间: 1067600
    done...运算时间: 2265100
    计数器最终结果: 20000
  • 相关阅读:
    模板引擎
    MongoDB基础操作
    node异步编程
    关于bootstrap table 的可编辑列表的实例
    weblogic 补丁步骤
    BIZ中model.getSql源码分析
    windows切换 jdk的坑!!!
    Oracle 给予访问其他用户包的权限
    关于解决Tomcat服务器Connection reset by peer 导致的宕机
    查找多余逗号的正则表达式
  • 原文地址:https://www.cnblogs.com/Jomini/p/13621952.html
Copyright © 2011-2022 走看看