Вопрос по java, multithreading – Java синхронизированная разность потоков [дубликат]

0

Возможное дублирование:
В чем разница между синхронизированным методом и синхронизированным блоком в Java?
В чем разница между синхронизированной функцией и синхронизированным блоком?

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

<code>public synchronized void Method1 () {
  }

public myFunction (){
       synchronized (this) { 
     }
 }
</code>

Спасибо за помощь

Ваш Ответ

5   ответов
0

м выше, только один поток может вызывать Method1 одновременно; несколько потоков могут потенциально вызывать myFunction. Однако, поскольку myFunction не делает ничего, кроме ввода блока, синхронизированного по «this», практической разницы нет. Но myFunction потенциально может включать в себя другой код вне синхронизированной защиты, который может выполняться одновременно несколькими потоками.

0

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

public myFunction (){
   synchronized (anyObject) { 
 }
}

Теперь этот блок можно синхронизировать на основе этого объекта.

Где и в случае, когда использовалось синхронизированное ключевое слово, область его синхронизации зависит от вызывающего объекта.

Надеюсь, это помогло тебе. Наслаждайтесь кодированием !!!

3

защищаемых блокировкой, что может значительно повысить производительность.

Пример: давайте представим, что у нас есть сервлет, который дает на вход массив факторов большого числа, и мы хотим подсчитать, как часто сервлет запускается. Проблема заключается в синхронизации доступа к переменной состоянияrequestsCount

//Poor performance
class PoorFactorizer implements Servlet {
    private int requestsCount = 0;
    public synchronized void service(ServletRequest req, ServletResponse res) {
        BigInteger numberToFactorize = extractFromRequest(req);
        BigInteger[] factors = factorize(numberToFactorize); // long lasting
                                 // operation makes everyone wait 
        requestCount++;
        encodeResponse(res, factors);
    }
}

//Better perfomance
class PoorFactorizer implements Servlet {
    private int requestsCount = 0;
    public void service(ServletRequest req, ServletResponse res) {
        BigInteger numberToFactorize = extractFromRequest(req);
        BigInteger[] factors = factorize(numberToFactorize); 
        // since we need to guard only the class' state
        // let's guard only the operation with the state
        synchronized(this) {            
            requestCount++;
        }
        encodeResponse(res, factors);
    }
}  

UPD: Вы можете прочитать очень хорошее объяснение в шедевре «Параллелизм Java на практике» (глава 2). Я настоятельно рекомендую читать эту книгу от корки до корки.

+ 1 Пример был бы великолепен, так как вопрос не показываетлюбо операции. David Harkness
0

Если у тебя есть метод

public synchronized void methodA()
{
    while(condition)
    {
        // do Something That Takes A Minute ;
    } 
    // do Something That Needs A Lock;
    while(condition)
    {
        // do Something That Takes Another Minute ;
    } 
}

Он будет держать блокировку на 2 минуты больше, чем

public void methodA()
{
    while(condition)
    {
        // do Something That Takes A Minute ;
    } 
    synchronized(this)
    {
        // do Something That Needs A Lock;
    } 
    while(condition)
    {
        // do Something That Takes Another Minute ;
    } 
}

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

Возможно, вы можете разбить метод 2 на 2 метода и применить синхронизацию на уровне метода, но иногда это может привести к плохому коду.

SO обе функции предоставляются Java.

0

Увидеть разниц

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

Когда вы синхронизируете свой блок, вы выбрали критический код для блокировки (повышение производительности), и вы можете выбрать объект блокировки. [Допустим, у вас есть несколько объектов, выполняющих важные действия, например, забронировано место, и у вас есть несколько запросов на бронирование. Возможно, вы не разрешите всем бронировать одновременно, но не хотите блокировать это (текущий объект). В этом случае у вас должен быть общий объект для блокировки и выполнения операции. За один раз Lock может быть приобретен любым одним объектом. Таким образом, вы гарантируете только один заказчик за один раз. Следовательно, повторное бронирование не допускается].

Похожие вопросы