zoukankan      html  css  js  c++  java
  • 利用CountDownLatch和Semaphore测试案例

    package com.cxy;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    
    /**
     * Created by Administrator on 2019/4/10.
     */
    public class CxyDemo {
        // 请求总数
        public static int clientTotal = 5000;
    
        // 同时并发执行的线程数
        public static int threadTotal = 200;
    
        private static Map<Integer, Integer> map = new HashMap<>();
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal; i++) {
                final int count = i;
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        update(count);
                        semaphore.release();
                    } catch (Exception e) {
                        // log.error("exception" , e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
            System.out.println(map.size());
            //log.info("size:{}" , map.size());
        }
    
        private static void update(int i) {
            map.put(i, i);
        }
    
    }

    hashmap不是一个线程安全的类,上面就是对其进行测试

    执行结果:

    再执行一次:

    可见不是线程安全的,

    package com.cxy;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.*;
    
    /**
     * Created by Administrator on 2019/4/10.
     */
    public class CxyDemo {
        // 请求总数
        public static int clientTotal = 5000;
    
        // 同时并发执行的线程数
        public static int threadTotal = 200;
    
        //private static Map<Integer, Integer> map = new HashMap<>();
        private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal; i++) {
                final int count = i;
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        update(count);
                        semaphore.release();
                    } catch (Exception e) {
                        // log.error("exception" , e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
            System.out.println(map.size());
            //log.info("size:{}" , map.size());
        }
    
        private static void update(int i) {
            map.put(i, i);
        }
    
    }

    测试concurrentHashmap,可以知道是线程安全的

    package com.cxy;
    
    import java.util.HashMap;
    import java.util.Hashtable;
    import java.util.Map;
    import java.util.concurrent.*;
    
    /**
     * Created by Administrator on 2019/4/10.
     */
    public class CxyDemo {
        // 请求总数
        public static int clientTotal = 5000;
    
        // 同时并发执行的线程数
        public static int threadTotal = 200;
    
        //private static Map<Integer, Integer> map = new HashMap<>();
       // private static ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
        private static Map<Integer, Integer> map = new Hashtable<>();
    
        public static void main(String[] args) throws Exception {
            ExecutorService executorService = Executors.newCachedThreadPool();
            final Semaphore semaphore = new Semaphore(threadTotal);
            final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
            for (int i = 0; i < clientTotal; i++) {
                final int count = i;
                executorService.execute(() -> {
                    try {
                        semaphore.acquire();
                        update(count);
                        semaphore.release();
                    } catch (Exception e) {
                        // log.error("exception" , e);
                    }
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            executorService.shutdown();
            System.out.println(map.size());
            //log.info("size:{}" , map.size());
        }
    
        private static void update(int i) {
            map.put(i, i);
        }
    
    }

    hashtable也是线程安全:

    总结:通过semaphore来模拟线程数,然后通过countdownlatch线程计数器来计算执行的线程,这样可以来模拟高并发测试

  • 相关阅读:
    Mac 10.13安装telnet
    如何用万用表判断一个12V蓄电池是否没电
    CentOS 7开机不执行/etc/rc.local的解决方法
    华为S5300系列交换机限制特定IP可以登录Web
    Java Bean Validation 最佳实践
    一文说清文本编码那些事
    定义物料组(Material Group)
    kibana 搜索语法
    微服务相关
    Solve Error: nafxcw.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmt.lib(newaop.obj)
  • 原文地址:https://www.cnblogs.com/xiufengchen/p/10682315.html
Copyright © 2011-2022 走看看