Singleton Pattern


sdk159147@gmail.com
• , ( )
!
object: 0x40012a
~
!
object: 0x40012a
~
!
object: 0x40012a
~
N !
object: 0x40012a
~
object: 0x40012a
object: 0x40012a
object: 0x40012a
object: 0x40012a
N
.
.
.
.
.
.
N
!
?
?
• 

•
Singleton (1)
• private


•
static mInstance 

• data instance
Singleton (2)
•
getInstance() 

• Static
• s1, s2, s3 add()
3 ->


•
S1
add()
Data: 1
object
0x40012a
• s1, s2, s3 add()
3 ->


•
S1 S2
add() add()
Data: 1 Data: 2
object
0x40012a
object
0x40012a
• s1, s2, s3 add()
3 ->


•
S1 S2 S3
add() add() add()
Data: 1 Data: 2 Data: 3
object
0x40012a
object
0x40012a
object
0x40012a
Thread1 Thread2 Thread3
getInstance() getInstance() getInstance()
object: 0x400120
Thread1 Thread2 Thread3
getInstance() getInstance() getInstance()
nullptr !
!
object: 0x400120
Thread1
object: 0x400120
Thread2 Thread3
getInstance() getInstance() getInstance()
nullptr !
!
~
object: 0x400120
Thread1
object: 0x400120
Thread2
object: 0x400128
Thread3
getInstance() getInstance() getInstance()
nullptr !
!
~
nullptr?
! !
???
?
~
Thread1
Thread2
Thread3
mInstance = nullptr
Thread1
mInstance = nullptr
Thread2
mInstance = nullptr
Thread3
?
~
Thread1
Thread2
Thread3
mInstance = nullptr
Thread1
mInstance = nullptr
Thread2
mInstance = nullptr
Thread3
?
~
Thread1
Thread2
Thread3
mInstance = nullptr
Thread1
mInstance = nullptr
Thread2
mInstance = nullptr
Thread3
?
~
Thread1
Thread2
Thread3
mInstance = 0x400120
Thread1
mInstance = nullptr
Thread2
mInstance = nullptr
Thread3
?
~
Thread1
Thread2
Thread3
mInstance = 0x400120
Thread1
mInstance = 0x400120
Thread2
mInstance = nullptr
Thread3
?
~
Thread1
Thread3
mInstance = 0x400120
Thread1
mInstance = 0x400120
Thread2
mInstance = 0x400128
Thread3
Thread2
!
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
• if cmp Jmp instructure
.
!
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1
Thread3
Thread2
mInstance = nullptr
Thread1
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1(getInstance()+8)
Thread3
Thread2
mInstance = nullptr
jne instructure
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1(getInstance()+12)
Thread3
Thread2
mInstance = nullptr
mInstance nullptr
Thread3 cmp
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1(getInstance()+12)
Thread3(getInstance()+12)
Thread2
mInstance = nullptr
Thread3
Thread1
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1(getInstance()+16)
Thread2
mInstance = 0x400120
Thread3(getInstance()+12)
mInstance
Thread3
getInstance()+8 cmp mInstance, 0x0
getInstance()+12 jne getInstance()+20
getInstance()+16 mInstance = new Singleton()
getInstance()+20 ret
Thread1(getInstance()+20)
Thread2
Thread3(getInstance()+16)
mInstance = 0x400120
Thread1
mInstance = 0x400128
Thread3
• race condition
mutex thread
.

• ! Mutex !
DCL
(Double Checked Locking)
• Locking , if . 

-> lock
DCL
(Double Checked Locking)
• instance , lock .
DCL
(Double Checked Locking)
• Locking thread-safe .
instance .
object: 0x40012a
object: 0x40012a
object: 0x40012a
object: 0x40012a
object: 0x40012a
Only One Object, Same Instance!
~

Singleton 패턴 (김진영 - EVA, 소마에 10기)