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

Похоже, это будет делать:

function html_entity_decode(s) {
  var t=document.createElement('textarea');
  t.innerHTML = s;
  var v = t.value;
  t.parentNode.removeChild(t);
  return v;
}

Источник

17
задан Hanno Fietz 9 March 2009 в 10:29
поделиться

6 ответов

Да, Вы правы, и Вы разобрались в объяснении также. Ничего особенного для добавления.

Примечание, что, если бы методы были статичны , то они синхронизировались бы на различных объектах, а именно, их соответствующие классы (A и B).

РЕДАКТИРОВАНИЕ : Почему я уверен? Я не знаю, почему Вы не уверены?;-) myObject всего один объект - нет никакого различия между myObject атрибуты, которые прибывают из класса A и тех, которые происходят из класса B. (Ну, технически Вы могли, вероятно, использовать отражение для обнаружения, которые являются, который, таким образом, должно быть приблизительно различие, но забывают об отражении на данный момент. Для общих операций на объекте нет никакого различия.)

13
ответ дан 30 November 2019 в 13:21
поделиться

Да, синхронизировался, эквивалентно синхронизируемому (это).

, Чтобы быть больше точный :

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

7
ответ дан 30 November 2019 в 13:21
поделиться

Если Вы хотите быть более явными о своей блокировке, Вы могли бы сделать что-то вроде этого:

class A {

    protected final Object  mutex = new Object();
    public void myOneMethod() {
        synchronized (mutex) {
            // ...
        }
    }
}

class B extends A {
    public  void myOtherMethod() {
        synchronized (mutex) {
            // ...
        }
    }
}

На самом деле, этот шаблон рекомендуется Brian Goetz в Параллелизм Java на практике , разделите 4.2.1 "Шаблон монитора Java". Тем путем Вы знаете точно, куда Ваш монитор прибывает из.

3
ответ дан 30 November 2019 в 13:21
поделиться

Да. Использование Java "мониторы" для реализации синхронизации и синхронизированных методов использует экземпляр объекта, к ним обращаются как монитор, который является, очевидно, тем же в этом случае.

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

1
ответ дан 30 November 2019 в 13:21
поделиться

Да Вы корректны

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

0
ответ дан 30 November 2019 в 13:21
поделиться

Небольшое дополнение для людей, которые могут быть заинтересованы в будущем ..

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

0
ответ дан 30 November 2019 в 13:21
поделиться
Другие вопросы по тегам:

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