Подтвердить что ты не робот

Синхронизировать ( "Cache_Group" ) часть пропускается, почему это так?

Я пытаюсь понять, что моя синхронизация ( "Group_Name" ) пропускается, если я пытаюсь синхронизировать с ней разные значения, почему это так.

Рассмотрим следующую проблему.

У меня есть SyncGroup с именем - "Group1", в которой у меня есть MBO с именем "MBOGroup1", в котором у меня есть атрибуты "имя", "пароль", "код проверки". Я извлекаю данные и извлекаю атрибут как "releaseCode"

Теперь у меня есть еще одна SyncGroup с именем - GroupSub1, в которой у меня есть MBO с именем "MBOSubGroup1", в котором передаю атрибуты "releaseCode" , Я получаю некоторый результат.

Условие выглядит следующим образом

Если я получаю несколько строк для "MBOGroup1", я ставил цикл for для "GroupSub1" и передавал данные "releaseCode" в "GroupSub1" и извлекал результат

В большинстве случаев бывает, что некоторые releaseCode пропускаются, и я получаю неправильный "результат" для "GroupSub1" , почему это так? Это связано с тем, что цикл выполняется быстрее, чем synchronize(), или что-то еще, например, CacheGroup Policies как OnDemand и время как 10 секунд

Просьба помочь.

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

4b9b3361

Ответ 1

sychronized("Cache_Group")

Первое, что приходит на ум, - это то, что синхронизация по строке бесполезна.

sychronized блокирует доступ к блоку на основе заданной ссылки, а не значения. Использование "String" побеждает эту цель, потому что строки неизменяемы, а вызов синхронно ( "Cache_Group" ) дважды создает две строки с двумя разными ссылками, позволяя второй итерации разорвать предполагаемую блокировку.

EDIT: @see ReentrantLock для лучшего контроля доступа

Ответ 2

если вы делаете что-то вроде этого:

sychronized("Cache_Group")

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

пример:

public class test{
    final Object lock = new Object;

    public void apple(){
        sychronized(lock ){
            ...
        }
    }

    public void orange(){
        sychronized(lock ){
            ...
        }
    }
}

СОВЕТ: пример выше показывает блокировку внутри класса, если вы хотите блокировать между классами, тогда ваш объект блокировки должен быть статичным/над этими классами или глобальным, но будьте осторожны с блокировкой себя!