рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХреЗ рддреАрди рдпреБрдЧ

рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рд╢рд╛рдпрдж, рдЬреИрд╕реЗ рд╣реА рд╕реНрдерд┐рд░ рд╡рд╕реНрддреБрдПрдВ рджрд┐рдЦрд╛рдИ рджреАрдВред рд╕реНрдореЙрд▓рдЯрд╛рдХ -80 рдореЗрдВ, рдЪреЗрдВрдЬрд╕реЗрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рддреНрд░, рд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧреАрдВ, рдЬреЛ рдПрдХ рдЪреАрдЬ рд╕реЗ рдПрдХрдЬреБрдЯ рдереАрдВ - рдЙрдиреНрд╣реЗрдВ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдерд╛ред

1994 рдореЗрдВ, рдкреНрд░рд╕рд┐рджреНрдз рдкреБрд╕реНрддрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ 22 рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдЬрдирддрд╛ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╣рдорд╛рд░реЗ рдирд╛рдпрдХ, рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдирдХрд╛ C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:


//.h class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* _instance; } //.cpp Singleton* Singleton::_instance = 0; Singleton* Singleton::Instance() { if(_instance == 0){ _instance = new Singleton; } return _instance; } 

рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХ рдереЛрдбрд╝рд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреА рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдРрд╕реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╡рд┐рд░рд╛рд╕рдд рдХреА рд╕рднреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдХреЛрдИ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ - рдпрд╣ 1995 рдерд╛, рдФрд░ рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд┐рд╕реА рдХреЛ рднреА рд╢рд░реНрдорд┐рдВрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛ред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЛрдб рдЙрдореНрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрд╢рд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдк рдЬрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХрдИ рдереНрд░реЗрдб рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

1995 рдореЗрдВ, рд╕реНрдХреЙрдЯ рдорд╛рдпрд░реНрд╕ рдиреЗ C ++ рдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдЕрдкрдиреА рджреВрд╕рд░реА рдкреБрд╕реНрддрдХ рдЬрд╛рд░реА рдХреАред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдЙрд╕реЗ рд╕реНрдерд┐рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рдВрдЧреНрд▓рдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ - рддрд╛рдХрд┐ рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдпрд╣ рдЬрд╛рди рд╕рдХреЗ рдХрд┐ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХрдм рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдерд╛ рдХрд┐ рд╡рд┐рд╣рд┐рдд рд╕рд┐рдВрдЧрд▓рдЯрди рдорд╛рдпрд░реНрд╕ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ:
 class singleton { public: static singleton* instance() { static singleton inst; return &inst; } private: singleton() {} }; 


рдиреАрдЪ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рдХреЛ рд╣рд░рд╛рдпрд╛ред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд┐рд░ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдФрд░ рдХреЗрд╡рд▓ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реБрдП:

 class CMySingleton { public: static CMySingleton& Instance() { static CMySingleton singleton; return singleton; } // Other non-static member functions private: CMySingleton() {} // Private constructor ~CMySingleton() {} CMySingleton(const CMySingleton&); // Prevent copy-construction CMySingleton& operator=(const CMySingleton&); // Prevent assignment }; 

рдирдП C ++ 11 рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдереНрд░реЗрдбреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╕рднреА рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдХреЛ рдЕрднреА рднреА рдЗрд╕рдХреЗ рдкреВрд░реНрдг рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рд░рд╣рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдЗрд╕ рдмреАрдЪ, рдХрдо рд╕реЗ рдХрдо рдкрдВрджреНрд░рд╣ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рджрд┐рдорд╛рдЧреЛрдВ рдиреЗ рднрд╛рд╖рд╛рдИ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕реЗрд▓ рдореЗрдВ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред C ++ рдиреЗ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд┐рдирд╛ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ - рдЗрд╕рд▓рд┐рдП рдмрд╣реБрдд рдЬрд▓реНрдж рд╣реА рд▓рдЧрднрдЧ рд╣рд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдкрдиреА рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░реАрдо рдЖ рдЧрдП, рдЬреЛ "рдЕрдиреНрдп рд╕рднреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдерд╛ред" рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░рд╛ рдЕрдзреНрдпрд╛рдп рд╕рдорд░реНрдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдШрд░реЗрд▓реВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЙрд╕рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдореГрддреНрдпреБ рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рдЖрдВрджреНрд░реЗрдИ рдирд╕рдиреЛрд╡ рдиреЗ рднреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рд╕реНрддрд╛рд╡ ... рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рдиред

2004 рдореЗрдВ, рдореЗрдпрд░реНрд╕ рдФрд░ рдПрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рдиреЗ рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдЧреНрд▓рдЯрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд▓реЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдПред рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ - рдЕрдЧрд░ рдкрд╣рд▓реЗ рдореЗрдВ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд▓реЙрдХ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЕрдВрджрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВред

рдЗрд╕ рдмреАрдЪ, рдЯреНрд░рд╛рдпрд▓ рдФрд░ рдХреЗрд╕, рдереНрд░реЗрдб-рд╕реЗрдл рд╕рд┐рдВрдЧрд▓рдЯрди рдХреА рд╕рдорд╕реНрдпрд╛ рдЕрдиреНрдп рд╕реА-рд▓рд╛рдЗрдХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреНрд░реЙрд▓ рд╣реЛ рдЧрдИред рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛ рдореЗрдВ, рдФрд░ рдлрд┐рд░ C # рдореЗрдВред рдФрд░ рдЕрдм рдЬреЙрди рд╕реНрдХреАрдЯ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЗрд╕рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рдФрд░ рд╡реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рджреНрд╡рд╛рд░рд╛ рднреА рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП - рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдкред Microsoft рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ:
 using System; public sealed class Singleton { private static volatile Singleton instance; private static object syncRoot = new Object(); private Singleton() {} public static Singleton Instance { get { if (instance == null) { lock (syncRoot) { if (instance == null) instance = new Singleton(); } } return instance; } } } 


рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдХреАрдЯ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдЦрд░рд╛рдм рд╣реИред рдХреНрдпреЛрдВ?

- рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдВрд╕реНрдХрд░рдг 1.5 рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдиреЗ рдпрд╣ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рдорд╛рди рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ - рдЬрд╛рд╡рд╛ 1.7 рдмрд╣реБрдд рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ Microsoft рдЗрд╕ рдХреЛрдб рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
"рдЗрд╕реЗ рддреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред" рдЖрдк рдХреЛрд╖реНрдардХ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ - рдФрд░ рдпрд╣ рдмрд╛рдд рд╣реИред
- рд▓реЙрдХ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рдзреАрдореА рд╣реИ
- рдмреЗрд╣рддрд░ рдЦрд╛рдПрдВ

рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреА рд╡рд┐рдХрд▓реНрдк рдереЗред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкрдардиреАрдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╕реНрдХреАрдЯ (рдФрд░ Microsoft) рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдкрд╣рд▓рд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ: рдпрд╣рд╛рдБ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 public sealed class Singleton { private static readonly Singleton instance = new Singleton(); // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Singleton() { } private Singleton() { } public static Singleton Instance { get { return instance; } } } 



рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдЦреЗрддреЛрдВ рдХреА рдЙрддреНрд╕реБрдХ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ - рдЙрдиреНрд╣реЗрдВ рддреБрд░рдВрдд рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░ред рдПрдХ рдЕрджреНрднреБрдд рд╡рд┐рдЪрд╛рд░, рдФрд░ рд▓реЗрдЦрдХ рд╕реНрд╡рдпрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рд╣реИ? рдмреЗрд╢рдХ, рд╣рд╛рдБ:

- рдпрджрд┐ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдЯреИрдЯрд┐рдХ рддрд░реАрдХреЗ рд╣реИрдВ, рддреЛ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреАрдЪрд░ рд╣реИ - рдпрджрд┐ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд╣рд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕реНрдЯреИрдЯрд┐рдХ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдПрдХ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдХрдИ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рдВрдЧрд▓рдЯрди-рдПрд╕ рдХреЗ рд╕реНрдерд┐рд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд▓реВрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдХреЛрдИ рднреА рдирд╣реАрдВ рдмрдЪрд╛рдПрдЧрд╛ред

рдЕрдВрдд рдореЗрдВ, рдПрдХ рдиреЗрд╕реНрдЯреЗрдб рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рд┐рджреНрдз рдЖрд▓рд╕реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
 public sealed class Singleton { private Singleton() { } public static Singleton Instance { get { return Nested.instance; } } private class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly Singleton instance = new Singleton(); } } 


рдЗрд╕рдХрд╛ рджреЛрд╖ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ рдиреЗрд╕реНрдЯреЗрдб рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

C # рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, System.Lazy рд╡рд░реНрдЧ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ, рдЬреЛ рдЗрди рд╕рднреА рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рднреА рдЫреЛрдЯрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ:
 public sealed class Singleton { private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance { get { return lazy.Value; } } private Singleton() { } } 


рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдкрдардиреАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рдЖрд▓рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рднрд╛рд╖рд╛ рдХреА рдмрд╣реБрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ "рдзреЛрдЦрд╛" рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдбрдмрд▓-рд▓реЙрдХ рд╕реЗ рдЙрдирдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ, рдЬреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ "рдзреЛрдЦрд╛" рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдРрд╕реЗ "рд╣реИрдХ" рдЧрд▓рддреА рд╕реЗ рдЯреВрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИ - рдФрд░ рдлрд┐рд░ рднреА рдпрд╣ рдкреИрдЯрд░реНрди рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдорд╛рдирдХ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП C # рдореЗрдВ рдХрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдкреВрд░реЗ рдХреАрд╡рд░реНрдб рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдХреЛ "рдЯреНрд░рд┐рдХ" рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдорд╛рдирдХ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рди рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рддрд╛рд▓рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЙрдХ (obj) рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

 lock(this) { // other code } 


рдЗрд╕ рдХреЛрдб рдХреА рддрд░рд╣ рдХреБрдЫ:

 Boolean lockTaken = false; try { Monitor.Enter(this, ref lockTaken); // other code } finally { if(lockTaken) Monitor.Exit(this); } 


рдЬреЗрдлрд░реА рд░рд┐рдХреНрдЯрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдЕрд╕рдлрд▓ рдорд╛рдирддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛, рдХреЛрд╢рд┐рд╢ рдмрд╣реБрдд рдзреАрдореА рд╣реИред рджреВрд╕рд░реА рдмрд╛рдд, рдЕрдЧрд░ рджреБрд░реНрдШрдЯрдирд╛ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЧрд▓рдд рд╣реИред рдФрд░ рдЬрдм рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рдлрд┐рд░ рд╕реЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреАред рдЗрд╕рд▓рд┐рдП, рд╡рд╣ рдирд┐рдпрдорд┐рдд рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП Monitor.Enter / Monitor.Exit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ, рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣:

 public sealed class Singleton { private static readonly Object s_lock = new Object(); private static Singleton instance = null; private Singleton() { } public static Singleton Instance { get { if(instance != null) return instance; Monitor.Enter(s_lock); Singleton temp = new Singleton(); Interlocked.Exchange(ref instance, temp); Monitor.Exit(s_lock); return instance; } } } 


рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ C # рдорд╛рдирдХ рдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдЕрдм рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдЧрд▓рдЯрди рдХрд╛ рдЖрд░рдВрдн рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЬреЗрдлрд░реА рд░рд┐рдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕реА # рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдПрд▓рдЖрд░ рдХреЗ рдЕрдзреНрдпрд╛рдп 29 рдореЗрдВ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдорд╛рдорд▓рд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВ, рдкреНрд░рд╕рд┐рджреНрдз рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХрд┐рдВрдЧ рддрдХрдиреАрдХ ред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдЬрдЧрд╣ рдФрд░ рдбрдмрд▓-рд▓реЙрдХ рдерд╛

рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдХреБрдЫ рднреА рдЦрд░рд╛рдм рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рддреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/In147373/


All Articles