Vector输出结果不是5000的问题

来源:5-6 同步容器-1

互联网的搬运工

2018-03-24

public class VectorExample {

	// 请求总数
	public static int clientTotal = 5000;
	// 并发数
	public static int threadTotal = 200;
	
	private static Vector<Integer> vector = new Vector<>();
	
	public static void main(String[] args) throws InterruptedException {
		
		ExecutorService exec = Executors.newCachedThreadPool();
		final Semaphore semaphore = new Semaphore(threadTotal);
		final CountDownLatch latch = new CountDownLatch(clientTotal);
		for (int i = 0; i < clientTotal; i++) {
			final int count = i;
			exec.execute(new Runnable() {
				
				@Override
				public void run() {
					try {
						semaphore.acquire();
						update(count);
						semaphore.release();
					} catch (InterruptedException e) {
						log.error("exception", e);
					}
				}
			});
			latch.countDown();  // 每一个请求减一
		}
		
		latch.await(); // latch为0的时候输出结果
		exec.shutdown();
		log.info("size:{}",vector.size());
	}
	
	private static void update (int i) {
		vector.add(i);
	}

输出结果:

11:41:57.559 [main] INFO com.okali.concurrency.commonUnsafe.HashMapExample - size:4989


写回答

3回答

Jimin

2018-04-04

latch.countDown(); 位置错了~
0
5
不知所措_Kevin
回复
Jimin
明白了,谢谢老师
2018-08-22
共5条回复

贰零一贰

2018-12-31

我和楼主的问题一样,“countDownLatch.countDown();”的位置不对,写成下面这样就好了:

public static void main(String[] args) throws InterruptedException {
    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();
                add(count);
                semaphore.release();
            } catch (InterruptedException e) {
                log.error("exception", e);
            }
            countDownLatch.countDown();
        });
    }
    countDownLatch.await();
    executorService.shutdown();
    log.info("size:{}", list.size());
}


1
0

Jimin

2018-03-24

你好,你运行的结果不是这个例子的。。。。是 HashMapExample 例子的

0
0

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程