高并发中的两个问题,一个关于是否要使用同步关键子的,另一个是关于while()循环的??

类中开启了两个子线程,运行在zhuYe()方法中,
第一个问题是:在tomcat中,有没有必要加同步关键字?
我认为,这个方法运行在不同线程的线程栈中,互相隔离;没有必要加关键字;但是我又但心,该方法中的两个子线程在并发下互相影响,所以加了同步关键子

第二个问题是:在代码的最下方为了等待子线程1和子线程2都运行完成后,在进行后续的操作,我在这里运用了while()循环不停的去检查其中的条件,但是我又感觉这样做会降低系统的性能,不知到还有啥好的方法没?
我认为,一开始我想用消费者生产者模式来做,但是这里是需要同时等待2个子线程完成,不知道该如何做??
谢谢!!

public class yuanDanWeiController {
    private static final Object object = new Object();

    @RequestMapping("/zhuYe")
    public void zhuYe(HttpServletRequest request, HttpServletResponse response) {
        synchronized (object) {
            //子线程1
            Callable<List<YuanDanWei>> callableList = new Callable<List<YuanDanWei>>() {
                @Override
                public List<YuanDanWei> call() throws Exception {
                    List<YuanDanWei> l = ys.searchPage(suoYin, pageBean.getRows(), FENZU);
                    return l;
                }
            };
            Future<List<YuanDanWei>> listFuture = executorService.submit(callableList);
            list = listFuture.get();

            //子线程2
            Callable<Integer> callable = new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    return ys.daoCount(FENZU);
                }
            };
            Future<Integer> Intfuture = executorService.submit(callable);
            count = Intfuture.get();

            //循环判断等待两个线程执行
            while ((count == 0 && list.size() == 0) || (count != 0 && list.size() != 0) || list.size() == 0) {

            }
        }
    }
}
阅读 1.2k
1 个回答

问题1,看这个zhuYe()方法里面有没有使用到共享资源量。加锁目的是为了同一时刻,只有一个线程占用共享资源

问题2,使用 CountDownLatch 或者 CompletableFuture

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题