【发布时间】:2016-09-01 05:23:23
【问题描述】:
System.out.println(number);上的同步块需要下面的代码吗?
import java.util.concurrent.CountDownLatch;
public class Main {
private static final Object LOCK = new Object();
private static long number = 0L;
public static void main(String[] args) throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
Worker worker = new Worker(doneSignal);
worker.start();
}
doneSignal.await();
synchronized (LOCK) { // Is this synchronized block need?
System.out.println(number);
}
}
private static class Worker extends Thread {
private final CountDownLatch doneSignal;
private Worker(CountDownLatch doneSignal) {
this.doneSignal = doneSignal;
}
@Override
public void run() {
synchronized (LOCK) {
number += 1;
}
doneSignal.countDown();
}
}
}
我认为这是必要的,因为有可能读取缓存的值。
但有人说:
没必要。
因为当主线程读取变量number时,所有的工作线程都完成了变量number内存中的写操作。
【问题讨论】:
标签: java multithreading