2015-12-10 5 views
0

У меня есть следующий кодJava блок синхронизации множественного проверка состояния

public class MyClass { 

    private boolean condition1; 
    private boolean condition2; 
    private boolean condition3; 

    public void start(){ 

     synchronized (this) { 
      while(true){ 
       if(!condition1 || !condition2 || !condition3) break; 
       .....//line #1 
       if(!condition1 || !condition2 || !condition3) break; 
       .....//line #2 
       if(!condition1 || !condition2 || !condition3) break; 
       .....//line #n 
      } 
     } 

    } 

} 

условие1 до 3 может быть мутантный другими объектами. То, что я хочу достичь, - это вырваться из цикла сразу, когда любой другой объект установил какое-либо условие в false. Конечно, есть лучший способ, чем положить один лайнер, если проверка перед выполнением каждой строки?

СООБЩЕНИЕ

+0

И что происходит, когда: вы проверяете, что «если условие» является ложным, и до того, как вы выполните строку №1, какой-то другой поток сделал условие неблагоприятным (т.е. сделал условие 1, или условие2, или условие3 как ложное) для вас выполнить строку # 1? –

+0

Подождите! Вы помещаете _loop_ внутри синхронизированного блока? Даже без цикла, похоже, это может быть много кода. Целью блока «synchronized» является выполнение некоторого набора операторов как атома. Если имеет смысл вырваться из синхронизированного блока в точке A или точке B или точке C, то вы делаете там вещи, которые не должны быть атомарными. Ваши «синхронизированные» блоки всегда должны быть как можно меньше. –

ответ

0

Ну на самом деле в генетическом нет. Из общей точки зрения небезопасно делать такие проверки только в длинных хостах внутри вашего цикла, т. Е. Не после каждой команды.

Как минимум, я предлагаю исправить некоторые ошибки компиляции, скажем !condition1 не будет компилироваться, так как это не boolean типа. Он должен быть !condition.get().

Дальше обязательно нужно создать метод проверки: boolean test() { return !condition1.get() || ... ; } и использовать его в if (test()) break; вместо того, чтобы долго копировать if(!condition1.get() || ...) несколько раз.

0
while(!condition1 || !condition2 || !condition3) { 

} 

должен это сделать, нет?

лучше объединить условие проверки в отдельный метод tho, как @Andremonly предложил.

Если ваши условия могут быть обновлены другими типами, они должны быть отмечены как изменчивые, если вы их объявляете.

+0

с этим проверка будет один раз за цикл, а не один раз в строке кода. – Architucas

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