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