yigal_s: (Default)
[personal profile] yigal_s
попал на забавный клин в синглетоне: функция getInstance() может быть вызвана из-под конструктора, вызваного опять же из функции getInstance() для того же самого класса. Не обязательно напрямую, разумеется, а через цепочку вызовов. В моём случае всё было еще сложнее: getInstance() обратилась к кому-то там через COM, и пока вызов отрабатывался, в тот же тред пришел другой COM-вызов (вот не понимаю, зачем микрософт такое разрешил), приведший к новому вызову getInstance().

Иными словами
1. функция getInstance для класса T вызвается в самый первый раз
2. вызывается конструктор класса Т
3. конструктор вызывает еще что-то-там
4. что-то-там вызывает getInstance для класса Т


Вроде бы, ни в одной книжной имплементации синглетона я не видел защиты от подобного сценария, или упоминания о нём.

Date: 2006-01-25 01:35 pm (UTC)
From: [identity profile] peresmeshnik.livejournal.com
А что, это не С++? Звучит как типичное описание сидвуплясной штуки: синглтон + конструктор + класс.

Date: 2006-01-25 01:50 pm (UTC)
From: [identity profile] peresmeshnik.livejournal.com
Да, конечно.
Но обычно на ассемблере ОО не пишут (хотя, естественно, можно, и даже, более того, это просто). И на С ОО используется самое большее на стадии дизайна. Как-то С++ больше для ОО подходит (о Жабе я и не говорю, она для другого не приспособлена).

Date: 2006-01-25 02:12 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Я писал синглтоны на Яве. Точно так же их можно писать (и пишут) на C# и на многих других OO языках.

Date: 2006-01-25 02:12 pm (UTC)
From: [identity profile] dimrub.livejournal.com
Да, и на C, кстати, тоже.