Перераспределить объект, используемый несколькими потоками

Я использую массив Locks для защиты одновременного доступа к одной и той же записи базы данных. Каждая запись массива представляет собой запись базы данных, но база данных может расти по мере выполнения программы, поэтому я планировал использовать java.utils.Arrays.copyOf динамически заставить его расти, как в:

lockArray = Arrays.copyOf(lockArray, lockArray.length + 1);

Мой вопрос: может ли это вызвать проблемы с параллельным выполнением? например, если поток пытается прочитать из lockArray, когда выполняется копирование. Проблема, о которой я могу подумать, заключается в том, что если операция copyOf не является атомарной (чего я не знаю), то массив может быть изменен так же, как и при копировании, что приводит к несоответствиям.

Если так, есть ли способ избежать этой проблемы?

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

1 ответ

Решение

Предполагая, что вы публикуете новый массив в поточно-ориентированном виде (например, с помощью энергозависимой ссылки) и правильно защищаете расширение массива, так что несколько потоков не могут пытаться расширить массив одновременно (например, с помощью синхронизированного блока), затем не должно быть проблемы. (обратите внимание, что вы не можете сделать новый lockArray доступным для других потоков, пока не инициализируете все новые экземпляры блокировки).

Другие вопросы по тегам