java - 为什么局部变量不允许使用 volatile 关键字?

标签 java multithreading volatile final

考虑片段:

如果在主线程中,我在方法中有这个-

volatile CountDownLatch latch = new CountDownLatch(3);

new Thread(new ProcessThread("Worker1",latch, 20000)).start();//20 secs
new Thread(new ProcessThread("Worker2",latch, 60000)).start();//60 secs
new Thread(new ProcessThread("Worker3",latch, 40000)).start();//40 secs

我看到 volatile 显示为非法修饰符。并且只允许使用 final并最终保证初始化安全

public static class ProcessThread implements Runnable {
  final CountDownLatch latch;
  final long workDuration;
  final String name;

  public ProcessThread(String name, CountDownLatch latch, long duration){
      this.name= name;
      this.latch = latch;
      this.workDuration = duration;
  }
}

下面的对象即 new CountDownLatch(3) 是正确构造的,但我还想确保上面对象分配给的引用 latch 保证对其下方的代码可见。

final CountDownLatch latch = new CountDownLatch(3);

上面的代码是否保证初始化,以便 latch 对下面的代码完全可见,即

new Thread(new ProcessThread("Worker1",latch, 20000)).start();

最佳答案

局部变量存在于栈中;当然,当您两次调用相同方法时,它们的所有局部变量都在各自的堆栈上。

volatile 仅在多个 线程写入相同 内存位置(在堆上)时才有意义。

这对于方法体内的局部变量完全没有意义!

关于java - 为什么局部变量不允许使用 volatile 关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39952937/

相关文章:

java - 如何限制 spring 状态机实例使用的线程数量?

java - 跨多线程的 Spring bean 引用

java - 修复ThreadPool内存泄漏

c - if 语句、函数评估和编译器优化

java - 寻找方法 RandomAccessFile

java - 使用Java jersey和Spring Security进行的Pdf下载在初始化 postman 的请求时给出错误

c# - 线程管理——线程是否在执行完成后关闭?

C#:HashSet的volatile读写

c - 为什么这段代码需要 volatile 关键字?

java - 上传两个文件和一个对象失败并出现错误 415