Java线程 - 线程的本地变量

时间:2010-11-22 23:27:02

标签: java thread-safety

我很难理解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”等变量是局部的,还是它们在线程中共享,因此可能会发生线程冲突。如果是后者,如何最好地保护这些变量。

感谢帮助一个困惑的人。

埃利奥特

4 个答案:

答案 0 :(得分:7)

局部变量在堆栈上分配,并且是线程的本地变量。只有成员字段跨线程共享。因此,theWordZ不会跨线程共享,您无需担心冲突。

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

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

“之前发生”关系可以通过多种方式强制执行(使用synchronized关键字,final关键字,volatile关键字,使用java.util.concurrent库等。 )。

答案 1 :(得分:1)

该线程对可见的变量没有影响。就像你创建类并在不启动线程的情况下运行方法一样。如果多个线程将访问相同的对象,那么您必须查看使用锁以确保它们不会相互踩踏。

答案 2 :(得分:0)

就像JOTN所说,如果线程正在访问相同的对象,那么可能存在线程冲突。

如果在这种情况下globalArray变量在线程之间共享,而尤其是,如果它或其元素是修改,那么它可能是明智的使用锁/同步。

答案 3 :(得分:0)

除了变量的可见性和共享变量的锁定/同步问题......

  

线程的“theWord”和“Z”等变量是本地的

您询问的那些变量是循环的局部变量,不是类或实例的一部分,并且基于每个线程存在,因此不会发生任何冲突。