LongAdder[] + System.arraycopy() =?

Упрощенный сценарий состоит в том, что у меня есть массив LongAdders, и несколько потоков обращаются к этому массиву, чтобы увеличить переменную по заданному индексу.

Безопасно ли копировать массив без какого-либо дополнительного механизма блокировки?

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

Кто-нибудь может это подтвердить?

PS Я знаю, что я не могу получить самый последний снимок (приращения во время копирования), но это нормально.

1 ответ

Решение

LongAdder В любом случае массив будет содержать только ссылки, так что это то, что будет скопировано. Поля внутри LongAdder не имеют отношения к этому.

Является ли это "безопасным" для использования arraycopy зависит от того, что вы делаете с ним - если вы используете это для копирования одного массива в другой, то это нормально (само по себе; вам нужно беспокоиться о том, как сделать массив видимым для потоков). Если вы используете его для копирования одной части массива в другую часть того же массива, вы должны рассмотреть возможность чтения несколькими потоками из одного и того же индекса и получения разных ссылок.

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