Нет способа принудительно использовать однопотоковое использование Consumer
, по крайней мере, без накладных расходов такого же порядка, чем просто сделать поток Consumer
безопасным.
Но Consumer
не несет ответственности за обеспечение однопоточного использования. В Java отсутствие безопасности потоков является нормой для изменяемых классов, скажем, StringBuilder
, ProcessBuilder
, ArrayList
, HashMap
, любого вида итератора, DecimalFormat
, чтобы назвать некоторые примеры широко используемых изменяемых классов, которые не являются поточно-ориентированными и не обеспечивают однопоточное использование.
Обратите внимание, что вы можете просто добавить synchronized
к методу accept
потребителя, чтобы обеспечить выполнение одного потока за раз. При использовании в последовательном контексте есть вероятность, что оптимизатор JVM устраняет связанные с этим издержки.
Но самое простое решение - документировать требования и покончить с ними. Если кто-то использует ваш класс неправильно, он получит проблемы, о которых просил. Вы можете выполнять проверки достоверности с максимальной отдачей, но попытка сделать пуленепробиваемое программное обеспечение бесполезной тратой усилий.