Синхронизировать ( "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 зависят от результатов, полученных из предыдущего.
Ответы
Ответ 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 ){
...
}
}
}
СОВЕТ: пример выше показывает блокировку внутри класса, если вы хотите блокировать между классами, тогда ваш объект блокировки должен быть статичным/над этими классами или глобальным, но будьте осторожны с блокировкой себя!