Безопасна ли е нишката на NHibernate SessionFactory

Според документацията SessionFactory трябва да е безопасен за нишки:

ISessionFactory е безопасна за нишки, много нишки имат достъп до нея едновременно и изискват ISessions.

Гледам имплементацията и не мога да разбера как напр. OpenSession() може да бъде безопасен за нишки:

http://nhibernate.svn.sourceforge.net/viewvc/nhibernate/trunk/nhibernate/src/NHibernate/Impl/SessionFactoryImpl.cs?revision=5233&view=markup

Има няколко извиквания на lock(), но нищо в OpenSession(). Всички lock free thread safe реализации, които успях да намеря, бяха основно единични.


person Anonymous    schedule 20.01.2011    source източник
comment
ThreadSafe != използване на lock/singleton   -  person Paco    schedule 20.01.2011


Отговори (1)


OpenSession просто връща нов обект и предава полета от SessionFactoryImpl. Тези полета изглежда не са променени никъде (забрана на конструктора), така че това изглежда безопасно за нишки. Предпоставката е, че settings.CacheProvider.NextTimestamp() и sessionLocalInterceptor.SetSession(session); също са безопасни за нишки, тъй като те са потенциално променени в някои от претоварените извиквания на OpenSession.

Все пак има място за някои състезателни условия поне на .Dispose/.Close.

person nos    schedule 20.01.2011
comment
Гледайки кода, не е ли възможно първата нишка да изпълнява ред 1126, когато втората нишка би изпълнила линия 1123. Това би означавало, че втората нишка ще презапише създаването на сесия, преди първата нишка да извика sessionLocalInterceptor.SetSession(session); - person Anonymous; 20.01.2011
comment
Няма да презапише променлива, използвана в тялото на метода. - person Paco; 20.01.2011
comment
@Anonymous локалните променливи са в стека и стекът е за нишка. - person nos; 21.01.2011