Удостоверьтесь, что Java синхронизировался, блокировки взяты в порядке?

Я в настоящее время "вручную" делаю его через Задачу должностного лица перед сборкой, с помощью моего инструмент cmdnetsvnrev , но если бы кто-то знает лучший ccnet-интегрированный способ сделать его, я был бы рад услышать:-)

11
задан Cœur 6 October 2018 в 07:52
поделиться

6 ответов

Нет, synchronized предоставит доступ в любом порядке (зависит от реализации JVM). В некоторых сценариях это может даже привести к тому, что потоки будут голодать.

Вы можете обеспечить порядок, используя ReentrantLock (начиная с Java 5.0) с параметром fair = true . ( Lock lock = new ReentrantLock (true); )

20
ответ дан 3 December 2019 в 02:20
поделиться

c) есть ли лучший способ сериализации запросов?

Вы случайно не используете список в качестве очереди, т. Е. Выглядит ли шаблон использования примерно так?

while (some condition) {
    synchronized(theList){
        anItem = get and remove an element from theList
    }
    do some work with anItem
}

Если это так, вы можете взглянуть на интерфейс BlockingQueue вместо того, чтобы использовать свои собственные схемы блокировки. Реализации (например, ArrayBlockingQueue ) имеют настройки для справедливости и многое другое.

0
ответ дан 3 December 2019 в 02:20
поделиться

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

0
ответ дан 3 December 2019 в 02:20
поделиться

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

Это определено в разделе 17.1 Locks JLS. Обратите внимание, что это ничего не говорит о порядке, в котором потоки, ожидающие блокировки, должны получать доступ.

11
ответ дан 3 December 2019 в 02:20
поделиться

Вы не можете полагаться на порядок, в котором конкретный метод вызывается из каждого потока. Если это только два потока, может быть и да. Но представьте, что есть 3 потока и 1 поток уже получил доступ. Другие 2 потока, когда они попытаются получить доступ, будут ждать, и любой из них может получить доступ, и это не зависит от порядка, в котором они вызвали этот метод. Так что полагаться на заказ не рекомендуется.

3
ответ дан 3 December 2019 в 02:20
поделиться

Да.

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

-1
ответ дан 3 December 2019 в 02:20
поделиться
Другие вопросы по тегам:

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