写一个线程安全的投票系统
发布日期:2021-09-11 14:30:18 浏览次数:45 分类:技术文章

本文共 2812 字,大约阅读时间需要 9 分钟。

hot3.png

有一个map,key存储候选人名称,value存储该候选人的得票数。请实现一个线程安全的投票系统.

为了测试并发环境下的表现,我们先设计一个小的“框架”,用来模拟并发情况下的投票行为。 首先设计一个接口,代测试的代码在这个接口的方法里面被调用

public interface Worker {    void doWork();}

然后是并发执行器

public class ConcurrentRunner {    private static   int  threadCount = 0;    private  Worker worker;    public void setWorker(Worker w){        worker = w;    }    private ExecutorService service = Executors.newCachedThreadPool();    ConcurrentRunner(int  count ){        threadCount = count;    }    private final CountDownLatch countDownLatch = new CountDownLatch(threadCount);    public void run(){        for (int i = 0; i < threadCount; i++) {            Runnable runnable = new Runnable() {                public void run() {                    try {                        countDownLatch.await();                        worker.doWork();                    } catch (Exception e) {                        e.printStackTrace();                    }                }            };            service.execute(runnable);             //达到threadcount线程数量的时候,所有线程以前执行            countDownLatch.countDown();        }    }}

 

下面进入正题,这个题目主要考察的是并发控制,当然你可以用整个方法都加锁来实现,但是效率低下,借鉴CAS的思想来实现是最优解决方案:

import java.util.HashMap;import java.util.Random;import java.util.concurrent.ConcurrentHashMap;/** * Created by yzy on 2018/10/31. */public class Main {    /**     * 投票人数量     */    public static final int VOTER_COUNT = 100;    /**     * 候选人数量     */    public static final int CANDINATE_COUNT = 3;    /**     * 候选人     * @param args     */    public static final String[]  candinator = {"tom","lily","jimmy"} ;  //  private static HashMap
result = new HashMap(3); private static ConcurrentHashMap
result = new ConcurrentHashMap(3); public static void main(String[] args) { ConcurrentRunner concurrentRunner = new ConcurrentRunner(VOTER_COUNT); concurrentRunner.setWorker(new Worker() { @Override public void doWork() { Random random = new Random(); int index = random.nextInt(3); System.out.println("who="+index); String who = candinator[index]; // int num = result.get(who); // result.put(who,1); result.putIfAbsent(who,0); int num = 0; // while(!result.replace(who,num=result.get(who),num++)){ // while(!result.replace(who,num=result.get(who),++num)){ while(!result.replace(who,num=result.get(who),num + 1)){ } } }); concurrentRunner.run(); System.out.println("tom 票数" + result.get("tom")); System.out.println("lily 票数 " + result.get("lily")); System.out.println("jimmy 票数" + result.get("jimmy")); }}

 

转载于:https://my.oschina.net/u/4129361/blog/3051939

转载地址:https://blog.csdn.net/weixin_34413802/article/details/92427947 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:微服务注册中心注册表与hashcode实现golang版
下一篇:Python项目实战:各种抖音热门视频极速下载

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年03月27日 07时22分16秒