2013-07-15 4 views
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. 
    } 

} 

Что, если первый нить выполняет способ затем устанавливает flag к true, а перед выполнением линии 33 других нить выполняет метод затем сбрасывает переменную flag на false, Будет ли первая нить еще выполнить строку 33?

ответ

5

Ваш flag является локальной переменной. Каждый поток получает свою собственную копию в стеке. Они не мешают друг другу. Это может произойти только с общим состоянием, т. Е. Вещами в куче, т. Е. Полями объекта.

+0

Привет, могу ли я задать вопрос? как насчет параметров? у потоков есть своя копия? Благодарю. –

+2

Да, параметры также являются локальными переменными, и они также живут в стеке. Конечно, если параметры являются объектами, данные внутри этого объекта находятся в общей куче. – Thilo

2

No. его (логический флаг) является локальной переменной. Локальная переменная не включена в общую память. они являются локальными/частными для стека потоков и, следовательно, не производятся другие потоки/процессор.

0

Ваш метод является потокобезопасным, поскольку он не работает ни с одним общим ресурсом, как статическая переменная. Ваш флаг - это переменная метода, и каждый поток будет иметь локальную копию.

2

Когда вы создаете поток, у него будет свой собственный стек. Каждый поток будет иметь свой собственный стек, и один поток никогда не будет делиться своим стеком с другим потоком. Все локальные переменные, определенные в вашей программе, будут выделены в стеке. Следовательно, ответ Да Ваш flag переменная будет потокобезопасной.

 Смежные вопросы

  • Нет связанных вопросов^_^