В каких методах необходим synchronized

441
10 августа 2017, 22:09

Подскажите, есть ли ошибки в рассуждениях. необходимо установить модификатор synchronized только тем методам, которым необходимо.Объект класса Solution будет использоваться нитями.

Код задания:

public class Solution {
    private double param = Math.random();
    private StringBuilder sb = new StringBuilder();
    private void method0() {
        Double d = method3();
    }
    protected void method1(String param1) {
        Solution solution = new Solution();
        solution.method0();
    }
    public void method2(int param1) {
        param1++;
    }
    synchronized double method3() {
        double random = Math.random();
        param += 40.7;
        return random + param;
    }
    private synchronized void method4() {
        sb.append(1).append(1).append(1).append(1);
    }
    protected void method5(String param2) {
        new StringBuffer().append(param2).append(param2).append(param2);
    }
    public synchronized String method6(int param2) {
        System.out.println("Thinking....");
        method7(5e-2);
        sb = new StringBuilder("Got it!.");
        return sb.toString();
    }
    String method7(double param2) {
        return "" + param2;
    }
    public static void main(String[] args) {
    }
}

Рассуждения

  1. приватность или публичность методов не играет роли. Так как доступ к ним пойдет из этого же класса
  2. method 0 не нужно синхронизировать так как он обращается к результату метода 3 который и так синхронизирован
  3. method 1 не нужно синзронизировать потому что он ничего не делать ни к каким полям не обращается(обращаеться только к методу 0 который обращается к методу 3 который уже синхронизирован)
  4. method 2 не нужно, так как ни к каким полям класса он не обращается, только инкрементит передаваемый параметр, который ни куда не идет.
  5. method 3 надо синхронизировать так как идет обращение к полю класса

  6. method 4 надо так как stringbuilder не синхронизированный объект, и он поле класса.

  7. method 5 не надо так как Stringbuffer синхронизирован. Но полем класса не является нигде не используется.. (Кстати вопрос: если бы было поле класса типа Stringbuffer и метод в него также добавляет, видимо все равно не нужно делать synchronized?)
  8. method 6 надо так как обращение к полю sb
  9. method 7 не надо так как во первых нет обращения к полям.
READ ALSO
Удаление дубликатов в массиве String[] с использованием Arrays.copyOf

Удаление дубликатов в массиве String[] с использованием Arrays.copyOf

Привет всем, есть метод public String[] remove(String[] array), который должен удалить все дубликаты в массивеДля обрезания массива надо использовать метод...

455
Обращение из сервиса к сервиса(RESTful,Spring boot)

Обращение из сервиса к сервиса(RESTful,Spring boot)

RESTful сервису 1 необходимо получить данные с RESTful сервису 2Данные можно получить по урлу: /products

365
Почему в java конструкторы не наследуются? [требует правки]

Почему в java конструкторы не наследуются? [требует правки]

Можно получить ответ простым человеческим языком?

354