Аспект синхронизации вашего класса выглядит хорошо.
Конечно, это предполагает, что предварительные условия выполнены;т. е. блокировка является , удерживаемой текущим потоком при вызове await()
и signalAll()
.
Кроме того, мы должны предположить, что никакой другой код не изменяет ArrayList
с помощью методов, непоказано или через отражение.
Однако у вашего Condition
класса есть несколько дополнительных проблем:
Методы suspend
и resume
, которыми вы являетесьиспользование устаревших и склонных к тупикам;см. Устаревший поток Java-потоков . Ссылка объясняет проблемы и описывает лучшие (более безопасные) альтернативы для обычных сценариев использования.
Класс Condition
, который вы нам показали, не дает возможности дляпоток для получения блокировки, но API утверждает, что поток должен удерживать блокировку при вызове await
и signalAll
.
Мне также неяснопочему ты это делаешьОбычные способы реализации условных переменных:
- для использования примитивного мьютекса с
Object::wait
, Object::notify
и / или Object::notifyAll
или - для использования
Lock
и связанный Condition
объект.
См. javadocs для Thread
и Lock
для подробностей и примеров.
Мне неизвестно о какой-либо производительности или других преимуществах использования Thread::suspend
и Thread::resume
по сравнению с другими способами.