Я пытаюсь продумать какой-то дизайн в отношении выделения памяти и многопоточности в Java-приложении, и вот что мне интересно:
У меня есть класс, у которого есть синхронизированная коллекция, скажем, список, который обновляется несколько раз в секунду, но все обновления происходят внутри класса и его собственного потока, а не из других потоков. Однако у меня есть много других потоков, которые вызывают метод getCollection () и делают foreach для итерации его содержимого только для чтения. Вот чего я не знаю:
Если другой поток выполняет итерацию синхронизированного сбора, будет ли единственный поток, выполняющий обновления, ждать до момента времени, когда другие потоки не будут выполнять итерацию?
Мой второй вопрос: кажется, имеет смысл возвращать копию массива коллекции, а не саму коллекцию, выполняя .toArray, но если подумать об этом с точки зрения памяти, не нужно ли выделять новый массив Это размер содержимого коллекции каждый раз, и если вызов сотни раз в секунду вызывается для коллекции, в которой есть несколько тысяч объектов, то это то, чего я не знаю, имеет смысл или нет.
Кроме того, если я никогда не верну саму коллекцию, тогда синхронизировать список больше не нужно?
Буду признателен за любой вклад. Спасибо! - Дункан