Использование фиктивных граничных объектов дает максимальную эффективность при добавлении и удалении элементов, так как эти операции всегда происходят в предположении, что элемент имеет как предыдущего, так и последующего соседа. В целом реализация списка достаточно традиционна, но особо следует отметить поле currentPrev. В начале итерации (при вызове метода GetFirst) это поле устанавливается в null, а после получения очередного активного объекта (GetNext) изменяется на предыдущий активный объект. Поскольку активный объект в ходе своего выполнения может деактивировать себя, то ссылка на следующий объект будет потеряна. Ситуация еще больше усложняется, если объект деактивирует не только себя, но и своих соседей. Для решения этой задачи и служит currentPrev. Корректировка currentPrev выполняется в методе Remove. Если объект деактивируется (удаляется из списка) и, при этом, он является currentPrev, то currentPrev вначале переводится на предыдущий объект и только потом объект удаляется. Таким образом, currentPrev всегда ссылается на объект, который находится в списке и предшествует текущему объекту, но не обязательно является его ближайшим соседом. При активации объекта (добавлении его в список) выполняется три проверки:
* контроль неактивности объекта. Неактивность определяется тем, что поле next объекта равно null, то есть, у него еще нет соседа;
* контроль отсутствия фатальной ошибки. Если объект содержит непустую ссылку на исключительную ситуацию, то он был завершен с фатальной ошибкой (необработанной исключительной ситуацией) и не может быть активирован вновь;
* контроль отсутствия состояния ожидания. Если поле sleeping объекта имеет значение true, то объект стал неактивным в результате вызова одного из методов Sleep и может быть активирован только с помощью WakeUp.
При деактивации выполняется проверка, является ли объект действительно активным. Таким образом, можно безопасно активировать уже активные объекты и деактивировать неактивные объекты.
Деактивация объекта на некоторый интервал времени возможна в том случае, если объект не стоит в очереди таймера, не находится в состоянии ожидания и не завершен по фатальной ошибке. Если все эти условия выполняются, то объект удаляется из списка диспетчера и добавляется в список таймера.
Изменение списка выполняется в критических секциях (lock), что позволяет активировать и деактивировать объекты из других нитей приложения.