java - Java中方法参数的线程安全

标签 java multithreading concurrency parameter-passing

我想知道在 Java 中处理成员参数时线程安全是否已经发挥作用。

假设您有一个 API 方法

boolean moreThanTen(long value) {
    if(value > 10) return true;
    else return false;
}

这个方法是线程安全的吗?

我想这是因为每个线程都有自己的局部变量堆栈,并且原语都存储在这个局部堆栈中。

唯一让我不确定的是 long 将是两次单独的读取,因此通常不是线程安全的。

我的问题是:我能确定方法的参数被自动复制了吗?因此,当使用基元作为参数(甚至是 float/long)时,我能否确保在将其复制到局部变量时线程安全不会成为问题?

最佳答案

要成为线程不安全的,一个方法需要允许多个线程访问共享资源(例如字段)。

在您的示例中,没有共享资源(java 按值传递参数),因此该方法不可能不安全。

这一个是不安全的,因为 threshold 可以从多个线程访问,并且对变量的访问没有正确同步:

  • 一个线程可能正在读取 threshold 变量,而另一个线程正在更新它,这可能会导致读取不一致 ( long writes are not guaranteed to be atomic );和
  • 由于缺乏同步,一个线程对 threshold 变量的写入可能对另一个线程不可见,这可能导致第二个线程读取过时值。
private long threshold; //mutable, may change

boolean moreThanThreshold(long value) {
  return value > threshold; //side comment: cleaner than your if/else
}
void setThreshold(long t) { this.threshold = t; }

关于java - Java中方法参数的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057412/

相关文章:

c++ - 人们实际上使用什么无锁原语在c++中进行无锁音频处理?

c++ - 圆形无锁缓冲区

java - 阻塞队列与信号量

java - 模拟颜色透明度

java - 设置 LookAndFeel 时出错

c# - 具有动态 maxCount 的 SemaphoreSlim

java - 在服务器端有一个后台线程定期更新请求使用的一些数据的最佳实践?

java - 如何在Java中设置Fork/Join算法的阈值?

java - JComboBox 类型不是通用的;它不能用参数 <Object> 参数化

java - 禁用 .jar java 库中的 Logger