如何为所有java线程提供一个恒定的起点

如何为所有java线程提供一个恒定的起点,java,multithreading,Java,Multithreading,如果我在java中运行两个线程,并且这两个线程都调用一个函数,那么每个线程是否创建了每个函数的实例?或者一个线程会干扰另一个线程的更新吗? 例如,假设我有这样一个函数: void test () { int i=0; for (i=0;i<20;i++) { S.o.p(i); } } 无效测试(){ int i=0; 对于(i=0;i方法的局部变量不是线程争用的,因此另一个线程也将从i=0开始 只有类级别的实例和变量定义 对象,因此这些被认为是有

如果我在java中运行两个线程,并且这两个线程都调用一个函数,那么每个线程是否创建了每个函数的实例?或者一个线程会干扰另一个线程的更新吗? 例如,假设我有这样一个函数:

void test () {
    int i=0;
    for (i=0;i<20;i++) {
        S.o.p(i);
    }
}
无效测试(){
int i=0;

对于(i=0;i方法的局部变量不是线程争用的,因此另一个线程也将从i=0开始

只有类级别的实例和变量定义 对象,因此这些被认为是有争议的线程

局部变量存储在每个线程自己的堆栈中。这意味着局部变量永远不会在线程之间共享

局部变量(例如
int i
)仅由调用函数的线程持有(每个线程都有自己的堆栈,因此其他线程不会访问局部变量)。不在堆栈上的内存(如静态成员和由两个线程调用的非静态类成员)可由不同的线程访问和修改


为了直接回答这个问题,两个线程将独立运行(假设
S.o.p
不修改任何内容),就好像另一个线程没有运行一样。如果
S.o.p
修改一些(例如静态)值,则两个线程都将对其进行修改。无论如何,两个线程都将在
循环中运行20次。

在您的示例中,方法
test
的实例带有局部变量
i
。局部变量将在堆栈中每个线程,这意味着所有线程都有自己的局部变量。注意t在多线程环境中尝试使用堆中的数据(如实例的字段)时,应同步访问。详细信息:

在Java中,线程仅共享所谓的“共享可变状态”
。共享可变状态指类中的实例变量。例如,在下面的类中:

class account{

private int balance =0;

void test () {
    int i=0;
    for (i=0;i<20;i++) {
        i++;
    }
}

}
类帐户{
私人整数余额=0;
空隙试验(){
int i=0;

对于(i=0;i)您根本不需要对其进行变异。如果您希望在不同步的情况下自由发布和共享变量,则应创建不可变变量。改为创建一个新对象,并在构造函数中设置不可变变量,并且仅在那里不进行不安全的发布。