Как синхронизируемые статические методы работают в Java?

любая идея, как использовать FFI :: Platypus :: Lang :: ASM с Perl, пример будет оценен по достоинству

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

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

Более практичным решением будет написание C-кода, который вызывает ваш ассемблерный код (или встраивает его как встроенную сборку), а затем адаптирует этот код к Perl с использованием XS.

172
задан rtruszk 16 December 2015 в 13:04
поделиться

6 ответов

При помощи синхронизируемого на блокировке статического метода Вы будете синхронизировать методы класса и атрибуты (в противоположность методам экземпляра и атрибутам)

, Таким образом, Ваше предположение будет корректно.

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

Едва ли. Необходимо позволить той работе сделать RDBMS вместо этого. Они способны к этому виду материала.

единственная вещь Вы доберетесь путем синхронизации доступа к базе данных, должен подать ужасно медленную заявку. Далее больше в коде, который Вы отправили, Вы создаете Фабрику Сессии каждый раз, тот путь, Ваше приложение проведет больше времени, получая доступ к DB, чем выполнение фактического задания.

Воображают следующий сценарий:

Клиент A и B пытаются вставить другую информацию в запись X из таблицы T.

С Вашим подходом единственная вещь, которую Вы получаете, состоит в том, чтобы удостовериться, что каждого называют после другого, когда это произошло бы так или иначе в DB, потому что RDBMS будет препятствовать тому, чтобы они вставили половину информации от A и половины от B одновременно. Результатом будет то же, но только 5 раз (или больше) медленнее.

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

134
ответ дан Community 23 November 2019 в 20:38
поделиться

Обратиться к вопросу в более общем плане...

Имеют в виду, что использование синхронизировалось на методах, действительно просто стенография (предположите, что классом является SomeClass):

synchronized static void foo() {
    ...
}

совпадает с

static void foo() {
    synchronized(SomeClass.class) {
        ...
    }
}

, и

synchronized void foo() {
    ...
}

совпадает с

void foo() {
    synchronized(this) {
        ...
    }
}

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

class SomeClass {
    private static final Object LOCK_1 = new Object() {};
    private static final Object LOCK_2 = new Object() {};
    static void foo() {
        synchronized(LOCK_1) {...}
    }
    static void fee() {
        synchronized(LOCK_1) {...}
    }
    static void fie() {
        synchronized(LOCK_2) {...}
    }
    static void fo() {
        synchronized(LOCK_2) {...}
    }
}

(для нестатических методов, Вы хотели бы заставить блокировки быть нестатическими полями)

226
ответ дан Scott Stanchfield 23 November 2019 в 20:38
поделиться

Статические методы используют класс в качестве объекта для блокировки, которая является Utils.class для Вашего примера. Таким образом да, это в порядке.

17
ответ дан starblue 23 November 2019 в 20:38
поделиться

Почему Вы хотите осуществить это, только единственный поток может получить доступ к DB в любой момент?

Это - задание драйвера базы данных для реализации любой необходимой блокировки, принятие Connection только используется одним потоком за один раз!

Наиболее вероятный, Ваша база данных совершенно способна к обработке нескольких, параллельный доступ

9
ответ дан oxbow_lakes 23 November 2019 в 20:38
поделиться

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

2
ответ дан Ray Lu 23 November 2019 в 20:38
поделиться

Для ответа на вопрос да, это делает: Ваш synchronized метод не может быть выполнен больше чем одним потоком за один раз.

2
ответ дан David Z 23 November 2019 в 20:38
поделиться
Другие вопросы по тегам:

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