Skip to content

Instantly share code, notes, and snippets.

@Vox1oot
Created February 26, 2014 07:41
Show Gist options
  • Save Vox1oot/9225283 to your computer and use it in GitHub Desktop.
Save Vox1oot/9225283 to your computer and use it in GitHub Desktop.
package com.javarush.test.level17.lesson10.home04
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;
}
}
@alexshavelev
Copy link

можем объяснить почему именно так?

@Deivur
Copy link

Deivur commented Jul 1, 2015

+1
Обьясни, пожалуйста.

@Elbar
Copy link

Elbar commented Apr 15, 2016

+1, обьясни, пожалуйста.

@alekseytimoshchenko
Copy link

очень интересно почему так

@Metarock13
Copy link

  1. method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации
  2. method5() не нужно синхронизировать, потому что создается новый объект типа StringBuffer(), который в себе имеет встроенную синхронизацию
  3. method3() нужно синхронизировать, потому он доступается к общему private double param = Math.random(), который может использовать любой метод внутри класса Solution
  4. method0() не нужно синхронизировать, потому он вызывает в себе method3(), который в свою очередь синхронизированный
  5. method2() не нужно синхронизировать, потому что он не создает новых объектов и не изменяет общие ресурсы и не вызывает других методов
  6. method1() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, чтоб не получилось так что double i = method3() будет иметь значение из другого потока, а не из вашего
  7. method7() не нужно синхронизировать, потому что он не создает новых объектов и не изменяет общие ресурсы и не вызывает других методов
  8. method6() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, и у него есть вывод в консоль

@k-erofeenko
Copy link

спасибо )

@ArtemNovikov
Copy link

method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации
method5() не нужно синхронизировать, потому что создается новый объект типа StringBuffer(), который в себе имеет встроенную синхронизацию
вот, где собака была зарыта

@aivolyanskiy
Copy link

method4() нужно синхронизировать, потому что создается новый объект типа StringBuilder(), который не имеет встроенной синхронизации

Не согласен с этим утверждением. Его не нужно синхронизировать. Он private и его из класса Solution никто не вызывает - значит никто и не вызовет вообще. Если только не пользоваться хаками рефлексии.

method1() нужно синхронизировать, потому что он вызывает в себе метод, который не синхронизированный, чтоб не получилось так что double i = method3() будет иметь значение из другого потока, а не из вашего

Не согласен с этим утверждением. Переменная i локальная и располагается в стеке соответствующего потока, до которого в принципе не может добраться другой поток. Да к тому же еще method0 вообще ничего не возвращает так что вообще беспокоится не о чем.

@ZhoraKornev
Copy link

Сейчас это выглядит так:
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) {

}

}
Очень похоже но старая логика не подходит - хотя и есть тут много спорных моментов

@Roddg
Copy link

Roddg commented Apr 21, 2020

Method1 не меняет общие ресурсы, поэтому метод не нужно синхронизировать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment