gpt4 book ai didi

Java 线程 - 线程局部变量

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

我很难理解 Java 线程的工作原理,所以请原谅这个相当简单的问题。

假设我有一个包含 N 个线程的程序。每个线程在字符串数组的不同部分执行相同的指令。我们通过具有可运行接口(interface)的类来调用线程。为了这个例子的目的,假设它是这样的:

run() {
while (startStop = loopGetRange() != null) {

countLetters(startStop.start,startStop.stop);
/* start is the beginning cell in the array where the process starts
and stop is the ending cell in the array where the process stops */
}
}

最后 countLetters 只是一个简单的方法,如下所示:

private void countLeters (int start, int stop) {
for (int y = start; <= stop; y++) {
String theWord = globalArray[y];
int z = theWord.length;
System.out.println("For word "+theWord+" there are "+z+" characters");
}
}

这是我的问题:像“theWord”和“Z”这样的变量是线程本地的,还是它们在线程之间共享,因此可能会发生线程冲突。如果是后者,如何最好地保护这些变量。

感谢您帮助一个困惑的人。

埃利奥特

最佳答案

局部变量分配在栈上,对线程来说是局部的。只有成员字段在线程之间共享。因此,theWordZ 不会跨线程共享,您无需担心冲突。

鉴于字符串是不可变的,我们在方法 countLeters() 中唯一关心的线程安全问题是对 globalArray 的访问。

现在,如果这个数组的构造“发生在”对 globalArray 的访问之前,只要没有线程“写入”globalArray,代码就是安全的。

“happened-before”关系可以通过多种方式强制执行(通过使用 synchronized 关键字、final 关键字、volatile 关键字、使用 java.util.concurrent 库等)。

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

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