gpt4 book ai didi

java - 方法中是否需要 "volatile"?

转载 作者:行者123 更新时间:2023-12-03 23:13:29 27 4
gpt4 key购买 nike

我读到当线程访问变量时应该使用 volatile 以确保线程看到正确的值,但是当变量在方法中使用时这是否也适用?

示例代码:

public class Limiter
{
int max = 0;

public synchronized void doSomething()
{
max++;
if(max < 10)
System.out.println("Work");

System.out.println(max);
}

}

如果多个线程调用 doSomething,那么 max 将被设置为与前一个线程调用该方法时相同的状态是否安全?

因为doSomething()是同步的,我知道只有单个线程可以修改max,但是当下一个线程调用它的时候会发生什么呢? max 是否可以是不同的值,因为它不使用 volatile?或者它是否安全,因为“限制器”实例会自行修改它?

最佳答案

volatile 是字段声明的一部分,而不是其使用的一部分。将局部变量声明为 volatile 是没有意义的,因为局部变量不会被不同的线程看到。

在您的情况下,只要非同步方法中的代码没有访问 max 就没问题 - 内存模型基本上确保只要所有代码都获取/释放相同的监视器“guarding”一个变量,所有线程都会看到一个一致的值序列。 (除此之外,每个线程都必须在访问该值之前获取监视器这一事实意味着一次只有一个线程能够访问该值——您可以编写一个总顺序为“线程 X 在时间 t0-t1,线程 Y 在时间 t4-t5 有监视器”等)

关于java - 方法中是否需要 "volatile"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650306/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com