программистское
Jan. 25th, 2006 01:30 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
попал на забавный клин в синглетоне: функция getInstance() может быть вызвана из-под конструктора, вызваного опять же из функции getInstance() для того же самого класса. Не обязательно напрямую, разумеется, а через цепочку вызовов. В моём случае всё было еще сложнее: getInstance() обратилась к кому-то там через COM, и пока вызов отрабатывался, в тот же тред пришел другой COM-вызов (вот не понимаю, зачем микрософт такое разрешил), приведший к новому вызову getInstance().
Иными словами
1. функция getInstance для класса T вызвается в самый первый раз
2. вызывается конструктор класса Т
3. конструктор вызывает еще что-то-там
4. что-то-там вызывает getInstance для класса Т
Вроде бы, ни в одной книжной имплементации синглетона я не видел защиты от подобного сценария, или упоминания о нём.
Иными словами
1. функция getInstance для класса T вызвается в самый первый раз
2. вызывается конструктор класса Т
3. конструктор вызывает еще что-то-там
4. что-то-там вызывает getInstance для класса Т
Вроде бы, ни в одной книжной имплементации синглетона я не видел защиты от подобного сценария, или упоминания о нём.
no subject
Date: 2006-01-25 01:14 pm (UTC)no subject
Date: 2006-01-25 01:35 pm (UTC)no subject
Date: 2006-01-25 01:43 pm (UTC)но подобное могло возникнуть и на другом объектном языке программирования,
равно как и на другом необъектном языке. Да хоть и на ассемблере.
no subject
Date: 2006-01-25 01:50 pm (UTC)Но обычно на ассемблере ОО не пишут (хотя, естественно, можно, и даже, более того, это просто). И на С ОО используется самое большее на стадии дизайна. Как-то С++ больше для ОО подходит (о Жабе я и не говорю, она для другого не приспособлена).
no subject
Date: 2006-01-25 02:03 pm (UTC)no subject
Date: 2006-01-25 02:12 pm (UTC)no subject
Date: 2006-01-25 02:12 pm (UTC)