투케이2K

371. (kotlin/코틀린) @Synchronized fun 사용해 순차 작업 동기화 메소드 선언 및 sum 합계 연산 수행 본문

Kotlin

371. (kotlin/코틀린) @Synchronized fun 사용해 순차 작업 동기화 메소드 선언 및 sum 합계 연산 수행

투케이2K 2023. 8. 10. 07:33
반응형

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Kotlin

 

[소스 코드]

    // -----------------------------------------------------------------------------------------
    // TODO [전역 변수]
    // -----------------------------------------------------------------------------------------
    var sum = 0;




    // -----------------------------------------------------------------------------------------
    // TODO [액티비티 onCreate]
    // -----------------------------------------------------------------------------------------
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        try {

            /**
             * -----------------------------------
             * [설 명]
             * -----------------------------------
             * 1. 동기화란 ? 순차적으로 작업을 실행하며, 한 시점마다 한 스레드만이 접근 및 실행할 수 있습니다
             *            (공유자원을 같이 사용 시에 주로 사용)
             * -----------------------------------
             * 2. 사용이유 ? - 예시로, 1번과 2번 출입 카운트 시스템 기기가 있다고 가정을하고,
             *            - 1번과 2번에 동시에 손님이 방문을 하면 둘다 관련 add 메소드를 호출해서
             *              입장횟수 카운트를 수행하려고 한다.
             *            - 이럴경우 동시 호출을 수행하면서 카운트값이 잘못 계산될 수 도 있으므로
             *            - 이러한 방지로 add 메소드를 호출 시 1번이 카운트를 정상완료 후 2번이 카운트를 수행하고
             *              순차적으로 시스템이 동작하도록한다
             * -----------------------------------
             */


            // [작업] : [1]
            val sync_1 = Thread(Runnable {

                for(i in 1..5 step(1)) {
                    add("[1] : 작업", i) // [메소드 호출]
                }

            })
            sync_1.start() // [스레드 동작 수행]


            // [작업] : [2]
            val sync_2 = Thread(Runnable {

                for(i in 1..5 step(1)) {
                    add("[2] : 작업", i) // [메소드 호출]
                }

            })
            sync_2.start() // [스레드 동작 수행]

        }
        catch (e : Exception) {
            S_Log._printStackTrace_(A_Intro@this, "예외 상황 발생", null, e)
        }


    } // TODO [메인 종료]





    // -----------------------------------------------------------------------------------------
    // TODO [Synchronized 순차 작업 메소드 선언]
    // -----------------------------------------------------------------------------------------
    @Synchronized fun add(name: String, value: Int)  {

        // [전역 변수에 인풋 값 더하기]
        sum = sum + value

        // [로그 출력]
        Log.w(name, "INPUT : " + value.toString() + " / " + "SUM : " + sum.toString())

    }
 

[결과 출력]

W/[1] : 작업: INPUT : 1 / SUM : 1
W/[1] : 작업: INPUT : 2 / SUM : 3
W/[1] : 작업: INPUT : 3 / SUM : 6
W/[1] : 작업: INPUT : 4 / SUM : 10
W/[1] : 작업: INPUT : 5 / SUM : 15
W/[2] : 작업: INPUT : 1 / SUM : 16
W/[2] : 작업: INPUT : 2 / SUM : 18
W/[2] : 작업: INPUT : 3 / SUM : 21
W/[2] : 작업: INPUT : 4 / SUM : 25
W/[2] : 작업: INPUT : 5 / SUM : 30

 

반응형
Comments