seops

[Callback] 2. Singleton Class 본문

Android/Android

[Callback] 2. Singleton Class

seops 2020. 10. 12. 23:56

월요일을 재택근무로 시작하니, 살 맛난다. :)

 

저번 시간에 이어서, 아래와 같은 SimpleTimer를 만들어 보려고 한다.

 

먼저, 각 버튼에 역할을 부여한다.

1. btnEngine -> EngineStatus 변경

2. btnCommand -> CommandStatus 변경

3. btnBluetooth -> BluetoothStatus 변경

 

각 버튼을 누르게 되면, Singleton으로 구성된 클래스의 특정 메서드(send~)를 호출하고,

각 호출은 SimpleTimer를 갱신하는 Callback으로 이어진다.

 

개발 중, Kotlin을 이용한 Singleton Class를 만드는 방법에 대해 고민 중이다.

 

Kotlin Singleton Google Sample Code에 따르면, 아래와 같다.

class SimpleTimer {
    companion object {
        @Volatile private var INSTANCE: SimpleTimer? = null

        fun getInstance(): SimpleTimer = INSTANCE ?: synchronized(this) {
            INSTANCE ?: SimpleTimer().also { INSTANCE = it }
        }
    }
}

 

위 예제 코드를 분석해보자.

 

1. @Volatile

 - Volatile Annotation의 경우, Java volatile과 동일한 기능을 한다.

 - volatile keyword는 Java 변수를 '메인 메모리'에 저장하겠다는 것을 명시한 것이다.

 - 매번 변수의 값을 Read할 때마다, CPU 캐시에 저장된 값이 아닌, 메인 메모리에서 읽는다.

 - 또한, 변수의 값을 Write할 때마다, 메인 메모리까지 작성한다.

 

 - 그러면 왜 필요한가?

  -> volatile 변수를 사용하고 있지 않는 MutliThread 애플리케이션에서는 Task를 수행하는 동안 성능 향상을 위해, 메인 메모리에서 읽은 변수 값을 CPU 캐시에 저장하게 된다.

  -> 만약 MultiThread 환경에서 Thread가 변수 값을 읽어올 때, 각각의 CPU 캐쉬에 저장된 값이 다르기 때문에, 변수 값 불일치 문제가 발생하게 된다.

[ 참고 : https://nesoy.github.io/articles/2018-06/Java-volatile]

 

2. getInstance() 내, 이중 null 체크

 - 두 개의 동시성을 갖는 스레드가 동시에 실행되어, 두 개의 다른 객체를 만는 것을 방지하는데 유용하다.

[ 참고 : stackoverflow.com/questions/18093735/double-checked-locking-in-singleton ]

 

오늘 약간 다른 쪽으로 센 감이 있지만, 평소 혼란스러웠던 Singleton을 정리했다.

 

'Android > Android' 카테고리의 다른 글

[RecyclerView] 2. SimpleRecyclerView  (0) 2020.10.22
[RecyclerView] 1. RecyclerView and DiffUtil  (0) 2020.10.20
[Callback] 1. SimpleCallback  (0) 2020.10.07
[Firebase] 3. SimplePush  (0) 2020.10.04
[Firebase] 2. Push Notification 로직 구상  (0) 2020.09.22
Comments