2017-01-03 6 views
0

Являются ли переменные экземпляра классов без сервлетов потокобезопасными, если они созданы внутри метода сервлета, как показано ниже?Являются ли переменные экземпляра классов без сервлетов потокобезопасными?

//Non-servlet Class 
public class x{ 

    public String var1; 
    public String var2; 

    public String method(){ 
    return (var1 + var2); 
    } 
} 

Класс сервлета

public class myServlet extends HttpServlet { 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     String varA = "Hello "; 
     String varB = "World"; 
     String varC = null; 
     x xx = new x(); 
     xx.var1 = varA; 
     xx.var2 = varB; 
     varC = xx.method(); 
    } 
} 
+0

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

+0

Это означает, что var1 и var2 класса x не должны быть потокобезопасными, если несколько потоков используют метод myServlet doGet. Я прав? –

ответ

1

переменные экземпляра классов, не сервлета поточно?

В вашем случае это не переменная экземпляра, а переменная локали в области выполнения метода doGet().

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    ... 
    x xx = new x(); 
    ... 
    } 

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

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

public class myServlet extends HttpServlet { 
    x xx = new x(); 
    ... 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    ... 
    xx.doSomething(); // concurrency race 
    xx.var1 = varA; // concurrency race 
    ... 
    } 
+0

Итак, вы говорите, что это 100% -ная потоковая безопасность. правильно? –

+1

Справа. У вас будет несколько экземпляров 'xx', которые будут изолированы между ними. – davidxxx

1

Каждый раз, когда вы звоните new x() вы создаете new и независимый экземпляр x Это означает, что каждый поток имеет собственную копию и ничего не разделяет, поэтому вам не придется беспокоиться о безопасности потока.

+0

Каково это связано с новым экземпляром и потоком. Каждый поток не собирается создавать новый экземпляр x. –

+0

@WaleedKhan, когда вы вызываете 'new x()', ** каждый раз ** каждым потоком, который запускает эту строку, он создает «новый» экземпляр 'x'. Ничто не остановит это. –

+0

Является ли это применимо к инстанцированию внутри метода? Какой внешний метод? –

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

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