Здравствуйте, RushDevion, Вы писали:
RD>Теперь по реализации. Покажу на примере getter'a для Value
RD>А если добавить обработку ошибок инициализации, то код будет еще сложнее. При этом профит от lock-free выглядит более чем сомнительным.
RD>Так что рассматривай это скорее как академический пример.
Большое спасибо за пример. Основную идею я понял. В посте ниже справедливо указали, на то, что моя реализация не отвечает заявленным критериям, а именно при возникновении ошибки при получении значения ожидающие потоки не получат тот же объект исключения. Сейчас набросал небольшой тест кейс и думаю как модифицировать мою реализацию. Пока безуспешно.
На первый взгляд в вашей реализации добавить код для обработки ошибок инициализации значительно проще. Достаточно в цикле бросить исключение для всех ожидающих потоков и изменить механизм Sleep-wait.
Но меня не устраивает ограничение:
RD>RD>public class Lazy<T> where T : class
RD>...
RD>
На сколько понимаю это связано из-за ограничения методов Volatile.* Это можно как то обойти?