Перераспределить объект, используемый несколькими потоками
Я использую массив Locks для защиты одновременного доступа к одной и той же записи базы данных. Каждая запись массива представляет собой запись базы данных, но база данных может расти по мере выполнения программы, поэтому я планировал использовать java.utils.Arrays.copyOf
динамически заставить его расти, как в:
lockArray = Arrays.copyOf(lockArray, lockArray.length + 1);
Мой вопрос: может ли это вызвать проблемы с параллельным выполнением? например, если поток пытается прочитать из lockArray, когда выполняется копирование. Проблема, о которой я могу подумать, заключается в том, что если операция copyOf не является атомарной (чего я не знаю), то массив может быть изменен так же, как и при копировании, что приводит к несоответствиям.
Если так, есть ли способ избежать этой проблемы?
(Стоит отметить, что массив всегда будет расти, а не уменьшаться, и что индекс записи базы данных в lockArray всегда будет одинаковым независимо от того, во сколько раз массив вырос).
1 ответ
Предполагая, что вы публикуете новый массив в поточно-ориентированном виде (например, с помощью энергозависимой ссылки) и правильно защищаете расширение массива, так что несколько потоков не могут пытаться расширить массив одновременно (например, с помощью синхронизированного блока), затем не должно быть проблемы. (обратите внимание, что вы не можете сделать новый lockArray доступным для других потоков, пока не инициализируете все новые экземпляры блокировки).