일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- FragmentPagerAdapter
- 운동
- BottomNavigationViewEx
- FragmentSatePagerAdapter
- 재태크
- 2020년 목표
- 목표한번이뤄보자
- 독서
- overridePendingTraction
- Android Universal Image Loader
- TabLayout and ViewPager
- FrameLayout
- 개발
- Today
- Total
seops
[Callback] 2. Singleton Class 본문
월요일을 재택근무로 시작하니, 살 맛난다. :)
저번 시간에 이어서, 아래와 같은 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 |