我正在学习Java中的并发性,并且正在观看一段YouTube视频.这是关于多线程环境下的增量操作的说明.该问题的解决方案可以是易失性变量或同步块.但我的问题是,如果我使用同步块,我是否也需要使用易失性变量.如果我有一个同步的块还不够吗?我看到指导者使方法同步,也使变量不稳定.在我看来,这足以使方法同步,因为当线程进入同步方法时,它从主内存中获取变量的值,而当线程退出同步方法时,它直接将值发送到主内存,它将可用于其他线程.因此,我不认为将变量设置为易失性是强制性的.
代码是这样的:
public class ClientTest {
public static void main(String[] args) {
ExecutorService executorService = null;
Counter counter = new Counter();
try {
executorService = Executors.newFixedThreadPool(2);
Runnable task1 = () -> {
for (int i = 1; i <= 20000; i++) {
counter.increment();
}
};
Runnable task2 = () -> {
for (int i = 1; i <= 80000; i++) {
counter.increment();
}
};
executorService.submit(task1);
executorService.submit(task2);
executorService.awaitTermination(1, TimeUnit.SECONDS);
System.out.println("Final counter value: " + counter.getCounter());
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
…以及:
public class Counter {
private int counter;
public int getCounter() {
return counter;
}
public synchronized void increment() {
counter++;
}
}
是否强制声明计数器变量为易失性?