Не могу понять.
Почему не надо синхронизировать методы 1,2,5 ?
Vladimir Bortenev
20 уровень
Объясните. Не могу понять.
Решен
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Александр Неклеса Backend Developer
20 декабря 2017, 23:49решение
Синхронизировать нужно только методы изменяющие состояние объекта (или класса).
Т.е. те, которые меняют поля.
метод 1
protected void method1(String param1) {
Solution solution = new Solution();
solution.method0();
}
Каждый раз при вызове этого метода будет создаваться новы объект Solution . У каждого потока при кажом вызове будет создаваться СВОЙ НОВЫЙ ВНУТРЕННИЙ объект Solution .
При завершении этого метода, этот НОВЫЙ ВНУТРЕННИЙ объект Solution solution будет выкинут в мусор. Т.к. на него нет внешних ссылок, а значит другие потоки не смогут изменить его состояние.
метод 1 не меняет состояние у текущего объекта Solution (не путать с внутр Solution solution), к которому имеют доступ несколько потоков.
метод solution.method0(); вызывается у ВНУТРЕННОГО Solution solution который у каждого потока при каждом вызове метода 1 будет свой новый.
метод 2
public void method2(int param1) {
param1++;
}
Он меняет не поле param, а свой аргумент (int param1). Т.е. поле объекта не меняет, а значит потокобезопасен.
метод 5
protected void method5(String param2) {
new StringBuffer().append(param2).append(param2).append(param2);
}
поле объекта не меняет, а значит потокобезопасен.
При каждом вызове этого метода он возвращает НОВЫЙ объект StringBuffer
+70
Vladimir Bortenev
23 декабря 2017, 05:02
Спасибо за развернутый ответ!
+1
Александр Неклеса Backend Developer
23 декабря 2017, 12:19
Всегда пожалуйста Амиго )
+8