写一个线程安全的投票系统

有一个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<String , Integer> result = new HashMap(3);

    private static  ConcurrentHashMap<String , Integer> 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值