-
-
Save Vox1oot/9225283 to your computer and use it in GitHub Desktop.
package com.javarush.test.level17.lesson10.home04; | |
/* Синхронизированные методы | |
Установить модификатор synchronized только тем методам, которым необходимо | |
*/ | |
public class Solution { | |
private double param = Math.random(); | |
private void method0() { | |
double i = method3(); | |
} | |
protected synchronized void method1(String param1) { | |
Solution solution = new Solution(); | |
solution.method0(); | |
} | |
public void method2(int param1) { | |
param1++; | |
} | |
synchronized double method3() { | |
double random = Math.random(); | |
return random + param; | |
} | |
private synchronized void method4() { | |
new StringBuilder().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); | |
return "Got it!"; | |
} | |
String method7(double param2) { | |
return "" + param2; | |
} | |
} |
+1
Обьясни, пожалуйста.
+1, обьясни, пожалуйста.
очень интересно почему так
- method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации
- method5() не нужно синхронизировать, потому что создается новый объект типа StringBuffer(), который в себе имеет встроенную синхронизацию
- method3() нужно синхронизировать, потому он доступается к общему private double param = Math.random(), который может использовать любой метод внутри класса Solution
- method0() не нужно синхронизировать, потому он вызывает в себе method3(), который в свою очередь синхронизированный
- method2() не нужно синхронизировать, потому что он не создает новых объектов и не изменяет общие ресурсы и не вызывает других методов
- method1() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, чтоб не получилось так что double i = method3() будет иметь значение из другого потока, а не из вашего
- method7() не нужно синхронизировать, потому что он не создает новых объектов и не изменяет общие ресурсы и не вызывает других методов
- method6() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, и у него есть вывод в консоль
спасибо )
method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации
method5() не нужно синхронизировать, потому что создается новый объект типа StringBuffer(), который в себе имеет встроенную синхронизацию
вот, где собака была зарыта
method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации
Не согласен с этим утверждением. Его не нужно синхронизировать. Он private и его из класса Solution никто не вызывает - значит никто и не вызовет вообще. Если только не пользоваться хаками рефлексии.
method1() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, чтоб не получилось так что double i = method3() будет иметь значение из другого потока, а не из вашего
Не согласен с этим утверждением. Переменная i локальная и располагается в стеке соответствующего потока, до которого в принципе не может добраться другой поток. Да к тому же еще method0 вообще ничего не возвращает так что вообще беспокоится не о чем.
Сейчас это выглядит так:
package com.javarush.task.task17.task1716;
/*
Синхронизированные методы
*/
public class Solution {
private double param = Math.random();
private StringBuilder sb = new StringBuilder();
private void method0() {
Double d = method3();
}
protected synchronized 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) {
}
}
Очень похоже но старая логика не подходит - хотя и есть тут много спорных моментов
Method1 не меняет общие ресурсы, поэтому метод не нужно синхронизировать.
можем объяснить почему именно так?