240326 TIL - Volatile, Custom View 그리고 String 문자열 다루기

DoDoBest

·

2024. 3. 26. 23:42

오늘 학습한 내용

  1. 인프런 CS 강의
    DEEP DIVE : 싱글톤 패턴을 구현하는 7가지 방법 #2 ( Volatile 관련 개념 )
  2. 사이드 프로젝트 - PickPick
    Custom View에서 Layout이 View를 어떻게 그리는지 분석
  3. 프로그래머스 문자열 내림차순으로 배치하기 문제 다시 풀어보기

 

Volatile

멀티쓰레딩 환경에서 쓰레드가 2개 이상 생성되면 각 쓰레드는 변수가 케시메모리에 존재하면 그 값을 사용하며, 존재하지 않을 때 메인메모리에 접근하여 가져온다.

만약 쓰레드 A가 특정 Flag가 false로 바뀌기 전까지 while문을 반복할 때, 다른 쓰레드가 해당 값을 바꿔도 쓰레드 A는 캐시 메모리에 있는 값만 바라봄으로써 영원히 while문을 벗어나지 못할 수 있다.

 

예를 들어, 아래 코드를 실행해보면 B 쓰레드가 flag 값을 변경해도 A 쓰레드는 while문을 벗어나지 않는다.

class ThreadTest {
    private var flag = true

    fun test() {
        Thread { // A
            var cnt = 0
            while (flag) {
                cnt++
            }
            println("Thread finished")
        }.start()
        Thread { // B
            Thread.sleep(1000)
            println("flag to false")
            flag = false
        }.start()
    }
}

fun main() {
    ThreadTest().test()
}

 

flag에 volatile 키워드를 붙여 해당 변수는 무조건 메인 메모리에 있는 값을 사용하도록 강제할 수 있다.

그러면 쓰레드 A는 더 이상 true로 고정된 캐시 메모리만 바라보지 않기 때문에 while문을 벗어날 수 있다.

class ThreadTest {
    @Volatile
    private var flag = true

    fun test() {
        Thread { // A
            var cnt = 0
            while (flag) {
                cnt++
            }
            println("Thread finished")
        }.start()
        Thread { // B
            Thread.sleep(1000)
            println("flag to false")
            flag = false
        }.start()
    }
}

fun main() {
    ThreadTest().test()
}

 

 

while 문 중간에 thread.sleep을 걸면 flag에 volatile을 붙이지 않아도 while문을 벗어난다.

스레드가 일시 정지하는 동안, CPU 캐시와 메인 메모리 사이에 동기화가 발생할 수 있기 때문이라고 한다. 단, Thread.sleep에 의한 동기화가 모든 상황에서 반드시 일어난다고 할 수 없기 때문에 volatile을 사용하자.

class ThreadTest {
    private var flag = true

    fun test() {
        Thread { // A
            var cnt = 0
            while (flag) {
                Thread.sleep(100)
                println(cnt++)
            }
            println("Thread finished")
        }.start()
        Thread { // B
            Thread.sleep(1000)
            println("flag to false")
            flag = false
        }.start()
    }
}

fun main() {
    ThreadTest().test()
}

 

사이드 프로젝트 - Custom View

아래 GIF는 Slack 안드로이드 앱에서 볼 수 있는 UI로, 사이드 프로젝트에서 구현하고자 하는 것과 일치한다.

 

 

 

기존에 구현되어 있는 코드를 찾아보다가, FrameLayout을 이용해서 구현한 코드를 발견했다.

 

 

https://github.com/aaronbond/Swipe-Deck

 

GitHub - aaronbond/Swipe-Deck: A Tinder style Swipeable deck view for Android

A Tinder style Swipeable deck view for Android. Contribute to aaronbond/Swipe-Deck development by creating an account on GitHub.

github.com

 

 

Java 코드를 Kotlin으로 변환하는 것까지는 완료했다.

원하는 UI로 변경하기 위해, 7년 전에 작성된 레거시 코드들을 변경하기 위해 기존 코드의 흐름을 따라가며 어떻게 동작하는지 분석하고 있으며, custom View가 그려지는 과정을 함께 학습하고 있다.

 

 

 

 

https://github.com/DoTheBestMayB/PickPick

 

GitHub - DoTheBestMayB/PickPick: PickPick - 틴더와 같은 Swipe Layout을 기반으로 만든 Kotlin Android App

PickPick - 틴더와 같은 Swipe Layout을 기반으로 만든 Kotlin Android App - DoTheBestMayB/PickPick

github.com

 

 

프로그래머스 문자열 내림차순으로 배치하기

주어진 String 문자열을 z부터 a, Z부터 A 순서대로 재배열 하는 문제다.

저녁 스크럼 시간에 다른 조원 분이 해당 문제를 질문하셔서, 더 빠른 방법은 없는지 확인해봤다.

 

https://dodobest.tistory.com/86

 

Kotlin Boxing Type 쓰지 마세요 체질이라는게바뀝니다

프로그래머스 문자열 내림차순으로 배치하기 문제를 풀어보며, String을 다룰 때 어떻게 하면 시간을 단축할 수 있는지 알아보겠습니다. https://school.programmers.co.kr/learn/courses/30/lessons/12917 프로그래

dodobest.tistory.com

 

'TIL' 카테고리의 다른 글

240328 TIL - 공공데이터 포털 버스 API 돌아보기  (0) 2024.03.29
240327 TIL - 학습 방향 수정  (0) 2024.03.27
240325 TIL  (0) 2024.03.25
240322 TIL  (1) 2024.03.22
240321 TIL - Kotlin Weekly  (0) 2024.03.21