当前位置:网站首页>Thread safe singleton mode
Thread safe singleton mode
2022-07-03 02:15:00 【abs(ln(1+NaN))】
The so-called single example , Just some classes , There can only be one object
When an object is created , First, you need to open up space for this object , Then call the constructor to initialize this object . However, in singleton mode , This process can only occur once , In order to achieve this goal , We need to meet the following Two conditions :
(1) Let only one object exist in memory , This object needs Class , meanwhile Use static modification (static Decorated variables will be placed in the global area )
(2) To prevent other objects of this class from appearing outside the class , We're going to put various constructors Put it in private in ( If the default construction 、 There are parametric structures 、 Copy structure is not used , have access to delete Ban )
Catalog
One 、 Two cases of singleton mode
Two 、 Singleton mode of lazy way
1、 Create objects within classes ( Demand one )
2、 Constructor privatize or disable constructor ( Requirement 2 )
3、 Provide external interfaces for obtaining objects
3、 ... and 、 Singleton mode test
Four 、 expand : Starving model ( Brief introduction )
One 、 Two cases of singleton mode
On the basis of the above , Since it is creating objects , When should it be created ?? There are two situations , One is the way of hungry men , One is the lazy way .
- Starving Han style : Wash the bowl immediately , Convenient for cooking in the back . The object is created when the program starts running
- The lazy way : free from restraint , Don't cook until you need it . When objects are needed , Then take the initiative to create
Two 、 Singleton mode of lazy way
Let's take a singleton class as an example , This class uses the lazy way in singleton mode , That is, wait until you want to use objects before creating objects , Let's implement it in sequence according to the above two conditions .
1、 Create objects within classes ( Demand one )
The first is to create a unique object , And use static modification . The only object is inside the class , Outside the class, it is inevitable that you cannot obtain it in the following two ways
Sington sig; // error
Sington* sig = new Sington(); // error Use this object externally , It must be obtained directly or indirectly through classes , Since you want to get through classes , Then you need to add static To modify

static The decorated member function should be initialized outside the class , The initialization method is similar to that of class member functions outside the class
Variable type Class name :: Variable name = A variable's value 
2、 Constructor privatize or disable constructor ( Requirement 2 )
The above step just creates the only object we want , So how to prevent the outside world from creating objects ??
The answer is : Put the constructor in private in , Or disable some constructors
==》 When an object is created in a class , You can call private Constructor in ; But if the object is created outside the class ,public The corresponding constructor cannot be found in , At this point, an error will be reported

Why not : Suppose we use the only object we get sig To create other objects , In the memory Sington Class will have more than one object , This violates the principle of singleton , So we need to disable the copy constructor
Sington sig1(sig); // copy constructor 3、 Provide external interfaces for obtaining objects
Because the created object is placed in private Medium , Cannot access directly outside the class , So we need to provide an interface for out of class access , Original version as follows :

But when multiple threads access this interface at the same time , There is a thread safety problem at this time , We need to protect sig This critical resource , So lock critical resources , The lock used must also be static Embellished

![]()

Now when a thread finally applies for a lock , But go in and have a look , Find out sig It has been initialized by other threads , Applying for a lock is superfluous , So we best Before applying for a lock , Add another judgment , First judge whether it is empty , Re apply for .

3、 ... and 、 Singleton mode test
We create in the main thread 5 Threads , every other 1s Print the address of the currently obtained object once , And threads ID

The test results are as follows :

Four 、 expand : Starving model ( Brief introduction )
Hungry man mode is created when the program starts running , The difference lies in the way the object is declared .
No * No. means to open up on the stack , At this time, the object will be allocated space when it is created

In the interface function , There is no need to judge whether it is empty , Just go back

Return value plus & The reason is that Prevent implicit calls to copy constructors
边栏推荐
- In 2022, 95% of the three most common misunderstandings in software testing were recruited. Are you that 5%?
- Visual yolov5 format data set (labelme JSON file)
- 微信小程序开发工具 POST net::ERR_PROXY_CONNECTION_FAILED 代理问题
- Job object of collaboration in kotlin
- Servlet中数据传到JSP页面使用el表达式${}无法显示问题
- [shutter] shutter debugging (debugging control related functions | breakpoint management | code operation control)
- Asian Games countdown! AI target detection helps host the Asian Games!
- Detailed analysis of micro service component sentinel (hystrix)
- Wechat applet Development Tool Post net:: Err Proxy Connexion Problèmes d'agent défectueux
- What are MySQL locks and classifications
猜你喜欢

树形结构数据的处理

4. 类和对象
![[shutter] hero animation (hero realizes radial animation | hero component createrecttween setting)](/img/e7/915404743d6639ac359bb4e7f7fbb7.jpg)
[shutter] hero animation (hero realizes radial animation | hero component createrecttween setting)

通达OA 首页门户工作台

微信小程序开发工具 POST net::ERR_PROXY_CONNECTION_FAILED 代理问题

What are the differences between software testers with a monthly salary of 7K and 25K? Leaders look up to you when they master it

微信小程序開發工具 POST net::ERR_PROXY_CONNECTION_FAILED 代理問題

Distributed transaction solution

Comment communiquer avec Huawei Cloud IOT via le Protocole mqtt

udp接收队列以及多次初始化的测试
随机推荐
Button button adaptive size of wechat applet
When the epidemic comes, how to manage the team as a leader| Community essay solicitation
SPI mechanism
Analyzing several common string library functions in C language
Performance test | script template sorting, tool sorting and result analysis
MySQL学习03
[fluent] fluent debugging (debug debugging window | viewing mobile phone log information | setting normal breakpoints | setting expression breakpoints)
Visualisation de l'ensemble de données au format yolov5 (fichier labelme json)
CFdiv2-Fixed Point Guessing-(区间答案二分)
Modify table structure
Technology sharing | Frida's powerful ability to realize hook functions
require. context
Current situation and future of Web3 in various countries
ByteDance data Lake integration practice based on Hudi
Where is the future of test engineers? Confused to see
File class (check)
[shutter] hero animation (hero realizes radial animation | hero component createrecttween setting)
Unrecognized SSL message, plaintext connection?
通达OA v12流程中心
[shutter] shutter debugging (debugging control related functions | breakpoint management | code operation control)