Использование перечислений имеет мало общего с безопасностью потоков.
Ваш код (как представлено здесь в вопросе) является потокобезопасным.Но следующее не так:
public class Task {
public static enum TaskList {
TASK_A {
int x = 0;
@Override
void doProcess() {
x++;
System.out.println("processing task A: " + x);
}
};
abstract void doProcess();
}
}
Как видите, это перечисление не имеет отношения к безопасности потока.Важно то, имеет ли объект (в данном случае значение enum) какое-либо внутреннее состояние, которое может измениться без надлежащей синхронизации, и все ли, что вызывает реальный код, также является поточно-ориентированным.