例如,我有一个非同步的方法,如下所示:
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.
}
}
如果第一个线程执行该方法然后将flag
设置为true
,并且在执行第33行之前,另一个线程执行方法然后将变量flag
重置为false
,第一个线程是否仍会执行第33行?
答案 0 :(得分:5)
您的flag
是一个局部变量。每个线程在堆栈上获得自己的副本。它们根本不会干扰彼此。这只能在共享状态下发生,即堆上的事物,即对象的字段。
答案 1 :(得分:2)
否即可。它的(布尔标志)是一个局部变量。局部变量不在共享内存上。他们 是线程堆栈的本地/私有,因此不会影响其他线程/处理器。
答案 2 :(得分:2)
创建线程时,它将拥有自己的堆栈。每个线程都有自己的堆栈,一个线程永远不会与其他线程共享其堆栈。程序中定义的所有局部变量都将在堆栈中分配内存。因此答案是是您的flag
变量将是线程安全的。
答案 3 :(得分:0)
您的方法是线程安全的,因为它不能处理任何共享资源,例如静态变量。您的标志是一个方法变量,每个线程都有一个本地副本。