All streams
Search
Write a publication
Pull to refresh
49
1.6
Рикки Мангуст @RikkiMongoose

Программист

Send message
Спасибо, что подбросили ссылку. Дело в том, что при форматировании статьи я нечаянно грохнул все ссылки на внешние ресурсы (включая и вот эту статью).
Я и сам удивлён. Оказывается, мои рабочие выписки и компиляции интересны и в наше облачное время :)
Ну, это-то верно. Поздно пить боржоми, когда конструктор отвалился.
Ага, есть у него такая особенность :).

Моё скромное IMHO — отлично реализованы и double-lock и Рихтеров. Именно потому, что если в языке/библиотеках к нему есть потоки, то должны быть и Lock, и атомарный перенос. А значит — будет не проблема перенести эти реализации куда-нибудь на Java.
Не намного. Но есть свои особенности. Например:

— static класс невозможно от чего-то унаследовать — а значит, не получится собрать абстрактную фабрику (фабрики рекомендуют объявлять синглтонами ещё в самой первой книжке).
— когда выполнится static-конструктор — никто не знает. Вроде бы «где-то в начале». К тому же, для ASP.Net-приложений может быть актуальным совмещение фабрика по производству синглтонов :) — по синглтону на сессию. Ведь в ASP.Net статичные переменный глобальны для всего приложения.
— Когда падает конструктор статического класса — всё падает. Когда падает конструктор синглтона — падает только функция, которая неосторожно его вызвала
— Невозможность засунуть в статичный класс счётчик состояний (например, чтобы можно было откатить его к предыдущим настройкам).
А если конструктор обвалится? Например, зашёл один поток — обвалил конструктор, заходит второй поток — и снова обваливает конструктор, делая ещё хуже.
Не намного. Но есть свои особенности. Например:

— static класс невозможно от чего-то унаследовать — а значит, не получится собрать абстрактную фабрику (фабрики рекомендуют объявлять синглтонами ещё в самой первой книжке).
— когда выполнится static-конструктор — никто не знает. Вроде бы «где-то в начале». К тому же, для ASP.Net-приложений может быть актуальным совмещение фабрика по производству синглтонов :) — по синглтону на сессию. Ведь в ASP.Net статичные переменный глобальны для всего приложения.
— Когда падает конструктор статического класса — всё падает. Когда падает конструктор синглтона — падает только функция, которая неосторожно его вызвала
— Невозможность засунуть в статичный класс счётчик состояний (например, чтобы можно было откатить его к предыдущим настройкам).
Я тоже не вижу особых проблем с double lock-ом — всё-таки все его недостатки уже успели устареть. Хотя и с Рихтером согласен — try-catch в этом случае не нужен.

Другое дело, что варианты с readonly и nested-классом расползлись по уйме книг и теперь много кто уверен, что именно «хаками» такое и надо писать.
А как думаете, не лучше ли вместо Lock писать нативный Monitor.Enter? Я тут больше ко мнению Jeffry Richter'а склоняюсь — сгенерированный комплятором try здесь а) тормозит б) если отвалится — уже не поможет.
Всё вы правильно поняли :). Поток создаёт temp, а потом _атомарно_ переносит его через Interlocked.CompareExchange. В итоге следующий поток уже не может ничего записать — Interlocked же.

Последний вариант я взял из CLR via C# by Jeffry Richter, последняя, 29-я глава. Там довольно подробно объясняется, почему так лучше.
12 ...
13

Information

Rating
1,429-th
Location
Долгопрудный, Москва и Московская обл., Россия
Date of birth
Registered
Activity