У меня есть многопоточный Java-код, в котором:
- несколько потоков считывают объекты с сохранением состояния из синхронизированного общего хранилища (т.е. в результате этого некоторые потоки могут ссылаться на одни и те же объекты);
- каждый поток затем вызывает метод
process()
и передает туда свой объект; -
process()
каким-то образом обрабатывает объекты, что может привести к изменению состояния объектов; - эти изменения состояния должны быть синхронизированы.
Я создал такой метод:
public void process(Foo[] foos) {
for (final Foo foo : foos) {
if (foo.needsProcessing()) {
synchronized (foo) {
foo.process(); // foo state may be changed here
}
}
}
}
Насколько мне известно, это выглядит законным. Тем не менее, инспекция IntelliJ жалуется на синхронизацию с локальной переменной, потому что "у разных потоков очень много разных локальных экземпляров" (это неверно для меня, поскольку я не инициализирую foos в методе).
По сути, я хочу добиться того же, что и метод Foo.process(), который не является для меня вариантом, поскольку Foo является частью сторонней библиотеки).
Я привык к коду без желтых отметок, поэтому любые советы сообщества оцениваются. Неужели так плохо делать синхронизацию для локальных жителей? Есть ли альтернатива, которая будет работать в моей ситуации?
Спасибо заранее!