我很难理解java线程的工作,所以请原谅这个相当简单的问题。
假设我有一个包含N个线程的程序。每个线程在字符串数组的不同部分上执行相同的指令。我们通过一个带有runnable接口的类来调用线程。出于这个例子的目的,让我们说它是这样的:
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”等变量是局部的,还是它们在线程中共享,因此可能会发生线程冲突。如果是后者,如何最好地保护这些变量。
感谢帮助一个困惑的人。
埃利奥特
答案 0 :(得分:7)
局部变量在堆栈上分配,并且是线程的本地变量。只有成员字段跨线程共享。因此,theWord
和Z
不会跨线程共享,您无需担心冲突。
鉴于String是不可变的,我们在方法countLeters()中对线程安全的唯一关注是访问globalArray。
现在,如果构造这个数组“发生在 - 之前”访问globalArray,只要没有线程“写入”globalArray,代码就是安全的。
“之前发生”关系可以通过多种方式强制执行(使用synchronized
关键字,final
关键字,volatile
关键字,使用java.util.concurrent
库等。 )。
答案 1 :(得分:1)
该线程对可见的变量没有影响。就像你创建类并在不启动线程的情况下运行方法一样。如果多个线程将访问相同的对象,那么您必须查看使用锁以确保它们不会相互踩踏。
答案 2 :(得分:0)
就像JOTN所说,如果线程正在访问相同的对象,那么可能存在线程冲突。
如果在这种情况下globalArray
变量在线程之间共享,而尤其是,如果它或其元素是修改,那么它可能是明智的使用锁/同步。
答案 3 :(得分:0)
除了变量的可见性和共享变量的锁定/同步问题......
线程的“theWord”和“Z”等变量是本地的
您询问的那些变量是循环的局部变量,不是类或实例的一部分,并且基于每个线程存在,因此不会发生任何冲突。