gpt4 book ai didi

java - 局部变量线程安全吗?

转载 作者:行者123 更新时间:2023-12-01 07:21:59 25 4
gpt4 key购买 nike

已经有类似的问题,但它没有回答以下问题。众所周知,字段的值不一定在线程之间立即同步。但是局部变量也是这样吗?可以抛出IllegalStateException吗?

public static void main(String[] args) {
final Thread mainThread = Thread.currentThread();
final Integer[] shared = new Integer[1];

new Thread(new Runnable() {
@Override
public void run() {
shared[0] = 1;
mainThread.interrupt();
}
}).start();

try {
Thread.sleep(1000);
} catch (InterruptedException e) {
if (shared[0] == null) throw new IllegalStateException("Is this possible?");
}
}

最佳答案

事实上,shared 的值对于所有线程都是相同的。但 shared[0] 的值还涉及读取数组元素,并且该数组元素(如字段)可能会受到数据竞争的影响。

Are you sure about shared being safe?

是的,Java Language Specification写道:

Local variables (§14.4), formal method parameters (§8.4.1), and exception handler parameters (§14.20) are never shared between threads and are unaffected by the memory model.

在 JVM 级别,每个线程都有自己的局部变量。如果匿名类访问封闭方法的局部变量,编译器会重写此代码,将变量的值作为构造函数参数传递给内部类,内部类会将其存储在 Final 字段中(这种重写是编译器要求的原因)这样的变量实际上是最终的并且明确分配的),并通过访问最终字段替换对此变量的所有访问。由于special guarantees Java 内存模型对于 Final 字段给出了规定,即使对象引用是通过数据竞争发布的,这种访问也是安全的,前提是这种发布仅在对象完成构造之后发生。

关于java - 局部变量线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34212353/

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