0

例如,我有一个像这样的非同步方法:

public void nonSynchronized(){
     boolean flag = false;

     if(/*some condition*/){
          flag = true;
     }

     //more line of codes here


     if(flag == true){ 
          //do something here - let's say line 33.
     }

}

如果第一个线程执行该方法然后将 设置flagtrue,并且在执行第 33 行之前,另一个线程执行该方法然后将变量重置flagfalse,那么第一个线程是否仍会执行第 33 行?

4

4 回答 4

5

flag是一个局部变量。每个线程在堆栈上都有自己的副本。他们根本不互相干扰。这只能发生在共享状态下,即堆上的东西,即对象的字段。

于 2013-07-15T10:47:19.977 回答
2

没有。its(boolean flag) 是一个局部变量。局部变量不在共享内存上。它们是线程堆栈的本地/私有,因此不会影响其他线程/处理器。

于 2013-07-15T10:47:43.417 回答
2

当您创建一个线程时,它将有自己的堆栈。每个线程都有自己的堆栈,一个线程永远不会与其他线程共享它的堆栈。程序中定义的所有局部变量都将在堆栈中分配内存。因此答案是肯定的,您的flag变量将是线程安全的。

于 2013-07-15T10:52:42.137 回答
0

您的方法是线程安全的,因为它不适用于任何共享资源,例如静态变量。你的标志是一个方法变量,每个线程都有它的本地副本。

于 2013-07-15T10:52:02.130 回答