SlideShare une entreprise Scribd logo
1  sur  29
THE SYS4U DOCUMENT



Java Concurrency Programming
                     - Introduction




                                                                2013. 03. 08
                                                                  김형석 수석
                              2012.08.21




                                           © 2012 SYS4U I&C All rights reserved.
목차

 I.   Java Concurrency Programming 101
 II. 동기화
 III. Executor 프레임워크
 IV. 더 알아보아야 할 내용들
 V. Q & A
 VI. References




                                         THE SYS4U PAPER 2012   |   2
I. Java Concurrency Programming 101
 1.   왜 병렬 처리를 해야 하는가?
 2.   Thread/Runnable
 3.   Thread 클래스의 Method들
 4.   ThreadLocal 이란?
 5.   Wait – Notify / NotifyAll
 6.   Timeout Job 예제 – 고전적인 기법




                                      THE SYS4U PAPER 2012   |   3
I. Java Concurrency Programming 101
1. 왜 병렬 처리를 하는가?

  Good to better, better to best.
  누구도 그저 작동하기만 하는 어플리케이션을 원하지 않는다.

                                      Serial Process                       Parallel Process




   성능 향상
      - 오래 걸리는 하위 작업으로 인해 나머지 모든 작업들이 지연되는 것을 막을 수 있다.

   자원 사용 효율 증대
      - 시스템 자원(멀티코어 프로세서, 메모리, IO장치 등) 사용율을 높여 결과적으로 어플리케이션의 성능을 향상시킬 수 있다.

   프로그램의 단순화
      - (잘 작성할 수만 있다면) 여러 가지 작은 작업을 분할해서 수행하는 것이 한번에 큰 작업을 수행하는 것 보다 쉽다.


                                                                              THE SYS4U PAPER 2012   |   4
I. Java Concurrency Programming 101
2. Thread / Runnable

  Java Concurrent ABC
  java.lang.Thread 클래스를 이용하면 실제 OS의 Thread와 연결되는 Heavy-Weight Thread 객체를 생성할 수 있다.*




                                                              Starting main-thread job
                                                              Finishing main-thread job
                                                              Starting user-thread job
                                                              ---- after 1 second……
                                                              Finishing user-thread job

                                                                                      THE SYS4U PAPER 2012   |   5
I. Java Concurrency Programming 101
3. Thread 클래스의 메소드들

  Managing Threads
  Multi-Thread 운용을 위한 기본적인 모든 기능을 제공한다.

                                           setName(String name)
                                            - Thread에 이름을 붙인다. 설정하지 않은 경우 기
                                            본 이름(Thread-#)으로 설정된다.

                                           setDaemon(boolean on)
                                            - Thread를 Daemon Thread로 만들지 여부를 결
                                            정한다. Main Thread는 Daemon Thread만 남아
                                            있으면 종료된다.

                                           setUncaughtExceptionHandler
                                            - RuntimeException이 발생한 경우 처리할 클래
                                            스를 설정한다.

                                           start
                                            - 재정의된 run 메소드를 병렬 실행한다. 만일 run
                                            메소드를 직접 실행하면 Main Thread에서 실행되
                                            므로 병렬처리 효과가 발생하지 않는다.

                                           Join / join(long milliseconds)
                                            - 이 Thread가 종료될 때 까지 대기한다.




                                                               THE SYS4U PAPER 2012   |   6
I. Java Concurrency Programming 101
4. ThreadLocal이란?

  Oh, my precious.
  각각의 Thread들은 공유되지 않는 자신만의 저장 공간이 필요하다.




   ThreadLocal의 장점
      - stateful 클래스가 별도의 동기화 작업 없이 Thread-Safe하게 처리 가능해진다.
      - 동기화에 대한 복잡한 설계나 정의가 필요없이 non-Thread-Safe 객체에 대한 처리가 가능하다.
      - 동기화 과정이 필요가 없기 때문에 성능의 향상을 기대할 수 있다.

   ThreadLocal의 주의사항
      - ThreadPool을 이용할 경우 Thread가 재사용될 수 있으므로, ThreadLocal 변수도 반드시 초기화하거나 무효화하여야 한다.

                                                                                   THE SYS4U PAPER 2012   |   7
I. Java Concurrency Programming 101
5. Wait – Notify / NotifyAll

  Don’t bother me, I’ll let you know.
  Object 클래스에 final로 선언되어 있는 wait/notify/notifyAll 메소드를 이용하면 효율적으로 Thread의 동작을 제어할 수 있다.
  wait 메소드는 코드 블럭을 사용하려는 모든 Thread를 대기하게 하고, notify/notifyAll 메소드는 대기하고 있던 Thread가 실행되도록 한다.
  notify는 가장 먼저 대기한 Thread에게 작업 소유권을 부여하고, notifyAll은 우선순위가 가장 높은 Thread에게 작업 소유권을 부여한다.




     Wait… I’m not ready.                                    Ok. Let’s do it.
                            Wait… I’m not ready.




   Can I work with you?                                Yeah~ Rock’n Roll!


                            Can I work with you?                                Still waiting……




                                                                                       THE SYS4U PAPER 2012   |   8
I. Java Concurrency Programming 101
6. Timeout Job 예제 – 고전적인 기법

  Join me
  별개의 Thread를 이용하여 메소드 실행이 일정 시간을 넘지 않도록 할 수 있다.




                                                                               실제 수행할 작업을 Anonymous
                                                                               Runnable 인스턴스를 이용하여 처리
                                                                               하도록 하고 Thread를 시작한다.




                                                                               최대 실행 시각만큼 join한 뒤에 결과
                                                                               를 리턴한다.

   고전적인 Timeout 기법
      - 작업을 수행할 별도 Thread를 이용
      - Main Thread(혹은 작업 Thread를 실행한 Thread)는 작업 Thread에 join하여 작업 Thread의 종료를 기다림
      - 필요한 경우 또다른 Thread를 이용하여 명시적으로 작업 Thread를 취소할 수 있음



                                                                                         THE SYS4U PAPER 2012   |   9
II. 동기화
 1.   왜 동기화를 해야 하는가?
 2.   동기화의 조건들
 3.   Atomic Wrapper Classes
 4.   volatile Keyword
 5.   synchronized Keyword
 6.   synchronized Keyword(2)
 7.   명시적 동기화 - Lock / ReentrantLock




                                       THE SYS4U PAPER 2012   |   10
II. 동기화
1. 왜 동기화를 해야 하는가?

  Tragedy of Commons.
  여러 개의 Thread가 동시에 동일한 자원에 접근할 경우에 해당 자원에 대한 접근을 제한하여 안정성을 보장하여야 한다.
  공유자원이 제대로 관리되지 않을 경우 비극적인 일이 일어난다.
  하지만, 역으로, Thread간에 공유할 자원이 없다면 동기화를 할 필요가 없다는 의미도 된다.

                                          UnsafeSequence.java
                         I feel weird…




                                           Timeline


                                          Thread      value -> 0        0 + 1 -> 1        value = 1
                                            A




                                          Thread
                                                           value -> 0        0 + 1 -> 1        value = 1
                                            B

          Rock’n Roll!

                           Rock’n Roll!



                                                                                              THE SYS4U PAPER 2012   |   11
II. 동기화
2. 동기화의 조건들

  All for One, One for All
  완벽한 동기화가 이루어지기 위해서는 원자성, 가시성, 코드 재배치 방지가 모두 보장되어야 한다..




          Atomicity                   Visibility           Code Reorder




                                                                  THE SYS4U PAPER 2012   |   12
II. 동기화
3. Atomic Wrapper Classes

  Synchronize without synchronized
  java.util.concurrent.atomic 패키지에서 제공되는 Atomic* 클래스들은 별도의 동기화 처리가 필요치 않은 동기화 메소드들을 제공한다.
  별도의 동기화 작업이 필요치 않다는 점에서 성능 향상을 도모할 수 있지만,
  두 개 이상의 Atomic 객체를 사용하는 상황에서는 별도의 동기화 처리가 필요하다.




                 OK, Rock’n Roll!                                             I feel weird…



                                                                                  THE SYS4U PAPER 2012   |   13
II. 동기화
4. volatile 키워드

  내가 너 그럴 줄 알았다.
  완벽한 동기화는 가시성, 원자성, 코드 재배치라는 세 가지 요소에 대해 안전하게 처리할 것을 보장해야한다.
  volatile 키워드는 이들 중 가시성과 코드 재배치에 대한 안전한 처리를 보장한다.
  원자성이 보장되어야 할 필요가 없다면 volatile 키워드로 충분하다.




                         OK, Rock’n Roll!                       I feel weird…



                                                                      THE SYS4U PAPER 2012   |   14
II. 동기화
5. synchronized Keyword

  Perfection requires the hand of time
  synchronized 키워드는 원자성, 가시성, 코드 재배치 모두를 제어하는 완벽한 동기화 처리를 지원하지만, 완벽한 만큼 더 많은 시간을 필요
  로 한다.
  synchronized 키워드는 메소드 선언부에 사용하여 this 인스턴스에 대해 동기화 할 수 있으며, 이를 암묵적 잠금(implicit lock)이라고 한다.




                                                                                   THE SYS4U PAPER 2012   |   15
II. 동기화
6. synchronized Keyword(2)

  최소 적용으로 최대 효과
  synchronized 블럭을 이용하면 더 명시적이고 효과적으로 필요한 부분에 대해서만 동기화를 수행할 수 있다.
  필요할 경우 외부에서 접근할 수 없는 private의 잠금용 인스턴스를 이용하여 동기화를 수행할 수도 있다.




                                                                    THE SYS4U PAPER 2012   |   16
II. 동기화
7. 명시적 동기화 – Lock / ReentrantLock

  Everyone is mad but some people can control the madness.
  JSDK1.4까지는 synchronized 키워드와 volatile 키워드만 사용할 수 있었다.(그나마 volatile은 5.0부터 제대로 동작하게되었다.)
  JSDK5.0에서 제공되는 Lock 인터페이스는 기존의 방식보다 더 명시적이면서 기존에는 사용하지 못했던 고급 기능을 사용할 수 있게 해 준다.

                                                            Unconditional Lock
                                                              - 좌측의 예제에서와 같이 특별한 조건을 걸지 않
                                                              는 경우이다. 기본적으로 synchronized 블럭과 동
                                                              일하게 동작한다.
                                                              Lock 구현체를 이용하는 모든 코드에서는 반드시
                                                              try-finally 구문을 이용하여 Lock.unlock()을 수행
                                                              하여야 한다.

                                                            Timeout Lock
                                                              - Lock.tryLock(long timeout, TimeUnit unit) 메
                                                              소드를 이용하면 일정 시간동안만 lock을 획득하
                                                              기 위해 대기할 수 있다.

                                                            Interruptible Lock
                                                              - Lock.lockInterruptibly() 메소드를 이용하면
                                                              lock이 외부의 interrupt() 호출에 반응하도록 할
                                                              수 있다.




                                                                                       THE SYS4U PAPER 2012   |   17
III. Executor 프레임워크
 1.   왜 Thread의 수를 제한해야 하는가?
 2.   Executor Interface
 3.   Callable / Future
 4.   진보된 Timeout Job 예제




                               THE SYS4U PAPER 2012   |   18
III. Executor 프레임워크
1. 왜 Thread의 수를 제한해야 하는가?

  덮어놓고 낳다보면 거지꼴을 못 면한다.
  JVM이 사용할 수 있는 자원은 한정되어 있다.
  필요하다고 그 때 그 때 만들어 사용하면 여러 가지 문제를 겪을 수 있다.

                                               Thread Life-Cycle 문제
                                                - Thread가 Process보다 경량이긴 하지만, 생성하고 제거하는 데에
                                                적지 않은 자원이 소모된다. 너무 많은 Thread를 생성하게 되면 생
                                                성된 Thread를 관리하는 데에 많은 비용이 든다.


                                               Memory 문제
                                                - (OS마다 다르지만) 보통 Thread 하나를 생성하여 관리하는 데에
                                                256KB~512KB 가량의 메모리가 소비된다. 과도하게 Thread를 생
                                                성할 경우 어플리케이션이 사용할 수 있는 메모리의 양이 제한될 수
                                                있다.


                                               자원의 과도한 사용
                                                - 모든 OS에는 자원(Memory, File Handle, Thread 수) 사용 제한이
                                                있다. 또, JVM의 실행 설정값에 따라 Java 어플리케이션이 이용할
                                                수 있는 자원의 크기도 제한된다. 만약 Java 어플리케이션이 실행되
                                                는 과정에서 자원 제한값을 초과하여 사용하게 되면
                                                OutOfMemoryError가 발생할 수 있으며 이런 종류의 문제는 해결
                                                이 불가능하다.(어플리케이션을 재시작하는 것이 바람직하다.)
                                                OutOfMemoryError가 발생하지 않는다 하더라도, 제한 없이
                                                Thread를 생성하는 것은 성능에 악영향을 끼칠 수 있다.




                                                                                 THE SYS4U PAPER 2012   |   19
III. Executor 프레임워크
2. Executor Interface

  The Newtype Executor
  java.util.concurrent.Executor 인터페이스를 이용하면 Thread를 직접 이용하여 병렬처리하는 것보다 훨씬 많은 이익을 얻을 수 있다.
  과거 new Thread(Runnable).start();를 이용했던 코드는 모두 Executor를 이용하도록 변경하는 것이 바람직할 정도로 이제는 기본 병렬처
  리 기법이라고 말할 수 있다.

                                                        Executors.newFixedThreadPool
                                                          - 고정된 크기의 ThreadPool을 생성한다. 지정된 크기 이상
                                                          의 Thread를 할당하는 것이 불가능하다.

                                                        Executors.newCachedThreadPool
                                                          - 기본적으로는 fixed size ThreadPool과 동일하다. 하지만
                                                          만약 지정된 크기보다 더 많은 수의 Thread가 필요할 경우
                                                          임시로 Thread를 만들어 사용한 뒤 해당 Thread를 제거한다.
                                                          (고정된 크기가 증가되지는 않는다.)

                                                        Executors.newSingleThreadExecutor
                                                          - 하나의 Thread만 갖는 ThreadPool을 생성한다. 작업이 순
                                                          차적(FIFO, LIFO 등)으로 실행되어야 하는 경우에 사용된다.


                                                        Executors.newScheduledThreadPool
                                                          - 기본적으로 fixed size ThreadPool이며, 병렬처리 작업이
                                                          지연되거나 특정 시간에 실행될 수 있도록 한다.




                                                                                     THE SYS4U PAPER 2012   |   20
III. Executor 프레임워크
3. Callable / Future

  나는 앞으로 일어날 일을 알고 있다.
  JSDK5.0부터 제공되는 Callable/Future 구조를 이용하면 병렬처리 작업으로부터 직접 결과를 얻어 사용할 수 있다.
  과거에는 병렬처리 작업으로부터 결과를 얻거나 Exception을 전달받기 위해 복잡한 작업을 수행해야 했으나, 이제는 옛 일이 되어 버렸다.




                                                                        THE SYS4U PAPER 2012   |   21
III. Executor 프레임워크
4. 진보된 Cancellation 예제

  The wise man avoids evil by anticipating it.
  Callable과 Future를 이용하면 병렬처리 작업을 손쉽게 취소할 수 있다.




                                                  THE SYS4U PAPER 2012   |   22
IV. 더 알아보아야 할 내용들
 1. Thread 관련
 2. 동기화 관련
 3. java.util.concurrent 패키지 관련




                                  THE SYS4U PAPER 2012   |   23
IV. 더 알아보아야 할 내용
1. Thread 관련

  It was the tip of the iceberg.
  Thread의 개략적인 사용법 뿐만 아니라 세부적인 개념을 이해할 수 있어야 한다.

   Thread Life-Cycle
     - Thread가 태어난 뒤 어떤 생을 살게 될까?


   interruption
     - Thread를 멈추는 방법은 무엇인가? 멈추라고 하면 정말 멈출까? 멈추기 위해 어떤 작업을 해야 하나?


   Deprecated methods
     - stop, suspend와 같은 메소드들은 왜 deprecated되었을까?


   wait – notify / notifyAll
     - 함부러 기다리라고 했다가는 큰일난다.


   Advanced Callable / Future
     - 미래를 지배하는자!




                                                                    THE SYS4U PAPER 2012   |   24
IV. 더 알아보아야 할 내용
2. 동기화 관련

 Welcome to hell.
 Lock을 거는 순간 모든 문제가 발생하기 시작한다.

   성능 문제
    - 과도한 동기화가 성능에 어떤 영향을 미칠까? 그럼 적절한 동기화는 괜찮나?


   데드락(Dead-Lock)
    - 서로 다른 두 개의 Thread가 각각 상대방의 작업이 종료되기를 기다린다면 어떻게 될까?


   자원 고갈(Starvation)
    - 하나의 Thread가 공유자원을 모두 소비해 버린다면?


   객체 공개(Object Publication)
    - 인스턴스를 잘못된 방식으로 외부에 공개하는 것은 동기화 구조를 깰 수 있다.


   재진입성(Reentrancy)
    - synchronized로 보호되어 있는 동기화 메소드가 자기 자신을 재귀호출한다면 어떻게 될까?


   Synchronized Collections
    - Vector나 Hashtable을 더 이상 사용하지 않는 이유는?


   ConcurrentModificationException
    - Iterator에 대한 작업을 수행하고 있는 과정에서 Collection의 내용이 변경된다면 어떠한 일이 발생할까?


                                                                         THE SYS4U PAPER 2012   |   25
IV. 더 알아보아야 할 내용
3. java.util.concurrent 패키지 관련

  Abstraction is Simplification.
  Java Concurrent Library는 과거 직접 만들어 사용해야 했던 수많은 병렬처리/동기화 개념들을 멋지게 추상화하여 사용하기 쉽게 만들었다.

   ExecutorService Life-Cycle
     - ExecutorService의 시작, 실행, 종료, 강제종료, 제거 등은 어떻게 처리되는가?


   ThreadPool Sizing
     - ThreadPool의 크기를 얼마로 할 때 최적의 성능을 발휘할 수 있는가?


   CountDownLatch
     - n개의 Thread가 처리완료될 때까지 기다리고 싶다면?


   CyclicBarrier
     - 특정한 조건이 만족될 때까지 Thread들의 동작을 대기하고 싶다면?


   Semaphore
     - 특정한 자원에 대해 접근이 허용되는 수 n 보다 더 많은 수 m개의 Thread가 동작하고 있다면?


   BlockingQueue
     - ExecutorService를 이용하여 손쉽게 Producer-Consumer 패턴을 구현하고 싶다면?


   Fork Join Framework
     - Callable 내에서 재귀 호출을 하는 것 같이 미래에 일어날 일을 완전히 예측하지 못하는 경우에는 Future를 사용할 수 없을까?


                                                                               THE SYS4U PAPER 2012   |   26
V. Q&A




         THE SYS4U PAPER 2012   |   27
VI. References
 Java Concurrency in Practice. - Brian Goetz 외 5명(Addison Wesley)

 5 things you didn’t know about java.util.concurrent. - Ted Neward(IBM DeveloperWorks)

 http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html

 http://www.journaldev.com/1090/java-callable-future-example - Pankaj(JournalDev)




                                                                             THE SYS4U PAPER 2012   |   28
감사합니다.




         THE SYS4U PAPER 2012   |   29

Contenu connexe

Tendances

Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
클로저
클로저클로저
클로저dagri82
 
242 naver-2
242 naver-2242 naver-2
242 naver-2NAVER D2
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요NAVER D2
 
Runtime Data Areas_Wh apm
Runtime Data Areas_Wh apmRuntime Data Areas_Wh apm
Runtime Data Areas_Wh apm엑셈
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현NAVER D2
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
Visual C++10을 활용한 병렬 프로그래밍
Visual C++10을 활용한 병렬 프로그래밍Visual C++10을 활용한 병렬 프로그래밍
Visual C++10을 활용한 병렬 프로그래밍흥배 최
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요KTH
 

Tendances (13)

Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
클로저
클로저클로저
클로저
 
242 naver-2
242 naver-2242 naver-2
242 naver-2
 
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
[2B7]시즌2 멀티쓰레드프로그래밍이 왜 이리 힘드나요
 
Runtime Data Areas_Wh apm
Runtime Data Areas_Wh apmRuntime Data Areas_Wh apm
Runtime Data Areas_Wh apm
 
Multi thread
Multi threadMulti thread
Multi thread
 
Ndc12 2
Ndc12 2Ndc12 2
Ndc12 2
 
Deep learning overview
Deep learning overviewDeep learning overview
Deep learning overview
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Visual C++10을 활용한 병렬 프로그래밍
Visual C++10을 활용한 병렬 프로그래밍Visual C++10을 활용한 병렬 프로그래밍
Visual C++10을 활용한 병렬 프로그래밍
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 

En vedette

iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4Usys4u
 
Aspect Oriented Programming_SYS4U I&C
Aspect Oriented Programming_SYS4U I&CAspect Oriented Programming_SYS4U I&C
Aspect Oriented Programming_SYS4U I&Csys4u
 
NAT and Hole Punching_SYS4U I&C
NAT and Hole Punching_SYS4U I&CNAT and Hole Punching_SYS4U I&C
NAT and Hole Punching_SYS4U I&Csys4u
 
Java reflection & introspection_SYS4U I&C
Java reflection & introspection_SYS4U I&CJava reflection & introspection_SYS4U I&C
Java reflection & introspection_SYS4U I&Csys4u
 
JavaEE6 Tutorial - Java Message Service_sys4u
JavaEE6 Tutorial - Java Message Service_sys4uJavaEE6 Tutorial - Java Message Service_sys4u
JavaEE6 Tutorial - Java Message Service_sys4usys4u
 
2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&Csys4u
 
About Color_SYS4U
About Color_SYS4UAbout Color_SYS4U
About Color_SYS4Usys4u
 
2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&Csys4u
 
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&CUIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&Csys4u
 
iOS Human Interface Guidlines #15_SYS4U
iOS Human Interface Guidlines #15_SYS4UiOS Human Interface Guidlines #15_SYS4U
iOS Human Interface Guidlines #15_SYS4Usys4u
 
Html5_SYS4U
Html5_SYS4UHtml5_SYS4U
Html5_SYS4Usys4u
 
Web Accessibility_SYS4U
Web Accessibility_SYS4UWeb Accessibility_SYS4U
Web Accessibility_SYS4Usys4u
 
웹어워드컨퍼런스강연자료 시스포유
웹어워드컨퍼런스강연자료 시스포유웹어워드컨퍼런스강연자료 시스포유
웹어워드컨퍼런스강연자료 시스포유sys4u
 
2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&Csys4u
 
UX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&CUX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&Csys4u
 
UX Layout Design_SYS4U
UX Layout Design_SYS4UUX Layout Design_SYS4U
UX Layout Design_SYS4Usys4u
 
iOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4UiOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4Usys4u
 
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&Csys4u
 
iOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4UiOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4Usys4u
 
iOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4UiOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4Usys4u
 

En vedette (20)

iOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4UiOS Human Interface Guidlines #14_SYS4U
iOS Human Interface Guidlines #14_SYS4U
 
Aspect Oriented Programming_SYS4U I&C
Aspect Oriented Programming_SYS4U I&CAspect Oriented Programming_SYS4U I&C
Aspect Oriented Programming_SYS4U I&C
 
NAT and Hole Punching_SYS4U I&C
NAT and Hole Punching_SYS4U I&CNAT and Hole Punching_SYS4U I&C
NAT and Hole Punching_SYS4U I&C
 
Java reflection & introspection_SYS4U I&C
Java reflection & introspection_SYS4U I&CJava reflection & introspection_SYS4U I&C
Java reflection & introspection_SYS4U I&C
 
JavaEE6 Tutorial - Java Message Service_sys4u
JavaEE6 Tutorial - Java Message Service_sys4uJavaEE6 Tutorial - Java Message Service_sys4u
JavaEE6 Tutorial - Java Message Service_sys4u
 
2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C2013 UX Design Trend Report Part 3_SYS4U I&C
2013 UX Design Trend Report Part 3_SYS4U I&C
 
About Color_SYS4U
About Color_SYS4UAbout Color_SYS4U
About Color_SYS4U
 
2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C2012 UX Design Trend Report Part 2_SYS4U I&C
2012 UX Design Trend Report Part 2_SYS4U I&C
 
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&CUIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
UIX UNIT_Several UI Teminologies Easy To Miss_SYS4U I&C
 
iOS Human Interface Guidlines #15_SYS4U
iOS Human Interface Guidlines #15_SYS4UiOS Human Interface Guidlines #15_SYS4U
iOS Human Interface Guidlines #15_SYS4U
 
Html5_SYS4U
Html5_SYS4UHtml5_SYS4U
Html5_SYS4U
 
Web Accessibility_SYS4U
Web Accessibility_SYS4UWeb Accessibility_SYS4U
Web Accessibility_SYS4U
 
웹어워드컨퍼런스강연자료 시스포유
웹어워드컨퍼런스강연자료 시스포유웹어워드컨퍼런스강연자료 시스포유
웹어워드컨퍼런스강연자료 시스포유
 
2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C2012 UX Design Trend Report Part 1_SYS4U I&C
2012 UX Design Trend Report Part 1_SYS4U I&C
 
UX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&CUX Planning Training Course_SYS4U I&C
UX Planning Training Course_SYS4U I&C
 
UX Layout Design_SYS4U
UX Layout Design_SYS4UUX Layout Design_SYS4U
UX Layout Design_SYS4U
 
iOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4UiOS Human Interface Guidlines #11_SYS4U
iOS Human Interface Guidlines #11_SYS4U
 
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&CJavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
JavaScript Profiling With The Chrome Developer Tools_SYS4U I&C
 
iOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4UiOS Human Interface Guidlines #10_SYS4U
iOS Human Interface Guidlines #10_SYS4U
 
iOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4UiOS Human Interface Guidlines #12_SYS4U
iOS Human Interface Guidlines #12_SYS4U
 

Similaire à Java_Concurrency_Programming_SYS4U

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programmingByeongsu Kang
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍Yong Joon Moon
 
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)클라우드 준
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화sung ki choi
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task운용 최
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2Daniel Lim
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 
Web Application Testing Patterns
Web Application Testing PatternsWeb Application Testing Patterns
Web Application Testing PatternsJune Kim
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임codenavy
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
A review of zookeeper 2010.12
A review of zookeeper 2010.12A review of zookeeper 2010.12
A review of zookeeper 2010.12HoJin Ha
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴효원 강
 
Holub on-patterns-2-1
Holub on-patterns-2-1Holub on-patterns-2-1
Holub on-patterns-2-1정환 임
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1정환 임
 

Similaire à Java_Concurrency_Programming_SYS4U (20)

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
파이썬 병렬프로그래밍
파이썬 병렬프로그래밍파이썬 병렬프로그래밍
파이썬 병렬프로그래밍
 
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)
일렉트론을 가볍게 한번 사용해보자! (설치부터 일렉트론으로 제이쿼리 사용하기)
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
20 handler and_async_task
20 handler and_async_task20 handler and_async_task
20 handler and_async_task
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
Web Application Testing Patterns
Web Application Testing PatternsWeb Application Testing Patterns
Web Application Testing Patterns
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 
주키퍼
주키퍼주키퍼
주키퍼
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
A review of zookeeper 2010.12
A review of zookeeper 2010.12A review of zookeeper 2010.12
A review of zookeeper 2010.12
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
자바 메모리 릭 패턴
자바 메모리 릭 패턴자바 메모리 릭 패턴
자바 메모리 릭 패턴
 
Holub on-patterns-2-1
Holub on-patterns-2-1Holub on-patterns-2-1
Holub on-patterns-2-1
 
HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1HolubOnPatterns/chapter2_1
HolubOnPatterns/chapter2_1
 

Plus de sys4u

iOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4UiOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4Usys4u
 
Observer Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4UObserver Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4Usys4u
 
iOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4UiOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4Usys4u
 
iOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4UiOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4Usys4u
 
iOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4UiOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4Usys4u
 
iOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4UiOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4Usys4u
 
30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4Usys4u
 
iOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4UiOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4Usys4u
 
Advanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4UAdvanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4Usys4u
 
Proxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4UProxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4Usys4u
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4Usys4u
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4Usys4u
 
iOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4UiOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4Usys4u
 
iOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4UiOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4Usys4u
 
Promotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&CPromotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&Csys4u
 
From Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&CFrom Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&Csys4u
 

Plus de sys4u (16)

iOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4UiOS Human Interface Guidlines #13_SYS4U
iOS Human Interface Guidlines #13_SYS4U
 
Observer Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4UObserver Design Pattern in Java_SYS4U
Observer Design Pattern in Java_SYS4U
 
iOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4UiOS Human Interface Guidlines #8_SYS4U
iOS Human Interface Guidlines #8_SYS4U
 
iOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4UiOS Human Interface Guidlines #7_SYS4U
iOS Human Interface Guidlines #7_SYS4U
 
iOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4UiOS Human Interface Guidlines #5_SYS4U
iOS Human Interface Guidlines #5_SYS4U
 
iOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4UiOS_Human_Interface_Guidlines_#4_SYS4U
iOS_Human_Interface_Guidlines_#4_SYS4U
 
30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U30_eCommerce_sites_using_html5_SYS4U
30_eCommerce_sites_using_html5_SYS4U
 
iOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4UiOS Human Interface Guidlines #3_SYS4U
iOS Human Interface Guidlines #3_SYS4U
 
Advanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4UAdvanced SWOT Analysis of e-commerce_SYS4U
Advanced SWOT Analysis of e-commerce_SYS4U
 
Proxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4UProxy_design_pattern_in_Java_SYS4U
Proxy_design_pattern_in_Java_SYS4U
 
Memory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4UMemory_leak_patterns_in_JavaScript_SYS4U
Memory_leak_patterns_in_JavaScript_SYS4U
 
Implementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4UImplementing_AOP_in_Spring_SYS4U
Implementing_AOP_in_Spring_SYS4U
 
iOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4UiOS Human_Interface_Guidlines_#2_SYS4U
iOS Human_Interface_Guidlines_#2_SYS4U
 
iOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4UiOS Human_Interface_Guidlines_#1_SYS4U
iOS Human_Interface_Guidlines_#1_SYS4U
 
Promotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&CPromotions_2nd_SYS4U I&C
Promotions_2nd_SYS4U I&C
 
From Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&CFrom Java code to Java heap_SYS4U I&C
From Java code to Java heap_SYS4U I&C
 

Java_Concurrency_Programming_SYS4U

  • 1. THE SYS4U DOCUMENT Java Concurrency Programming - Introduction 2013. 03. 08 김형석 수석 2012.08.21 © 2012 SYS4U I&C All rights reserved.
  • 2. 목차 I. Java Concurrency Programming 101 II. 동기화 III. Executor 프레임워크 IV. 더 알아보아야 할 내용들 V. Q & A VI. References THE SYS4U PAPER 2012 | 2
  • 3. I. Java Concurrency Programming 101 1. 왜 병렬 처리를 해야 하는가? 2. Thread/Runnable 3. Thread 클래스의 Method들 4. ThreadLocal 이란? 5. Wait – Notify / NotifyAll 6. Timeout Job 예제 – 고전적인 기법 THE SYS4U PAPER 2012 | 3
  • 4. I. Java Concurrency Programming 101 1. 왜 병렬 처리를 하는가? Good to better, better to best. 누구도 그저 작동하기만 하는 어플리케이션을 원하지 않는다. Serial Process Parallel Process  성능 향상 - 오래 걸리는 하위 작업으로 인해 나머지 모든 작업들이 지연되는 것을 막을 수 있다.  자원 사용 효율 증대 - 시스템 자원(멀티코어 프로세서, 메모리, IO장치 등) 사용율을 높여 결과적으로 어플리케이션의 성능을 향상시킬 수 있다.  프로그램의 단순화 - (잘 작성할 수만 있다면) 여러 가지 작은 작업을 분할해서 수행하는 것이 한번에 큰 작업을 수행하는 것 보다 쉽다. THE SYS4U PAPER 2012 | 4
  • 5. I. Java Concurrency Programming 101 2. Thread / Runnable Java Concurrent ABC java.lang.Thread 클래스를 이용하면 실제 OS의 Thread와 연결되는 Heavy-Weight Thread 객체를 생성할 수 있다.* Starting main-thread job Finishing main-thread job Starting user-thread job ---- after 1 second…… Finishing user-thread job THE SYS4U PAPER 2012 | 5
  • 6. I. Java Concurrency Programming 101 3. Thread 클래스의 메소드들 Managing Threads Multi-Thread 운용을 위한 기본적인 모든 기능을 제공한다.  setName(String name) - Thread에 이름을 붙인다. 설정하지 않은 경우 기 본 이름(Thread-#)으로 설정된다.  setDaemon(boolean on) - Thread를 Daemon Thread로 만들지 여부를 결 정한다. Main Thread는 Daemon Thread만 남아 있으면 종료된다.  setUncaughtExceptionHandler - RuntimeException이 발생한 경우 처리할 클래 스를 설정한다.  start - 재정의된 run 메소드를 병렬 실행한다. 만일 run 메소드를 직접 실행하면 Main Thread에서 실행되 므로 병렬처리 효과가 발생하지 않는다.  Join / join(long milliseconds) - 이 Thread가 종료될 때 까지 대기한다. THE SYS4U PAPER 2012 | 6
  • 7. I. Java Concurrency Programming 101 4. ThreadLocal이란? Oh, my precious. 각각의 Thread들은 공유되지 않는 자신만의 저장 공간이 필요하다.  ThreadLocal의 장점 - stateful 클래스가 별도의 동기화 작업 없이 Thread-Safe하게 처리 가능해진다. - 동기화에 대한 복잡한 설계나 정의가 필요없이 non-Thread-Safe 객체에 대한 처리가 가능하다. - 동기화 과정이 필요가 없기 때문에 성능의 향상을 기대할 수 있다.  ThreadLocal의 주의사항 - ThreadPool을 이용할 경우 Thread가 재사용될 수 있으므로, ThreadLocal 변수도 반드시 초기화하거나 무효화하여야 한다. THE SYS4U PAPER 2012 | 7
  • 8. I. Java Concurrency Programming 101 5. Wait – Notify / NotifyAll Don’t bother me, I’ll let you know. Object 클래스에 final로 선언되어 있는 wait/notify/notifyAll 메소드를 이용하면 효율적으로 Thread의 동작을 제어할 수 있다. wait 메소드는 코드 블럭을 사용하려는 모든 Thread를 대기하게 하고, notify/notifyAll 메소드는 대기하고 있던 Thread가 실행되도록 한다. notify는 가장 먼저 대기한 Thread에게 작업 소유권을 부여하고, notifyAll은 우선순위가 가장 높은 Thread에게 작업 소유권을 부여한다. Wait… I’m not ready. Ok. Let’s do it. Wait… I’m not ready. Can I work with you? Yeah~ Rock’n Roll! Can I work with you? Still waiting…… THE SYS4U PAPER 2012 | 8
  • 9. I. Java Concurrency Programming 101 6. Timeout Job 예제 – 고전적인 기법 Join me 별개의 Thread를 이용하여 메소드 실행이 일정 시간을 넘지 않도록 할 수 있다. 실제 수행할 작업을 Anonymous Runnable 인스턴스를 이용하여 처리 하도록 하고 Thread를 시작한다. 최대 실행 시각만큼 join한 뒤에 결과 를 리턴한다.  고전적인 Timeout 기법 - 작업을 수행할 별도 Thread를 이용 - Main Thread(혹은 작업 Thread를 실행한 Thread)는 작업 Thread에 join하여 작업 Thread의 종료를 기다림 - 필요한 경우 또다른 Thread를 이용하여 명시적으로 작업 Thread를 취소할 수 있음 THE SYS4U PAPER 2012 | 9
  • 10. II. 동기화 1. 왜 동기화를 해야 하는가? 2. 동기화의 조건들 3. Atomic Wrapper Classes 4. volatile Keyword 5. synchronized Keyword 6. synchronized Keyword(2) 7. 명시적 동기화 - Lock / ReentrantLock THE SYS4U PAPER 2012 | 10
  • 11. II. 동기화 1. 왜 동기화를 해야 하는가? Tragedy of Commons. 여러 개의 Thread가 동시에 동일한 자원에 접근할 경우에 해당 자원에 대한 접근을 제한하여 안정성을 보장하여야 한다. 공유자원이 제대로 관리되지 않을 경우 비극적인 일이 일어난다. 하지만, 역으로, Thread간에 공유할 자원이 없다면 동기화를 할 필요가 없다는 의미도 된다. UnsafeSequence.java I feel weird… Timeline Thread value -> 0 0 + 1 -> 1 value = 1 A Thread value -> 0 0 + 1 -> 1 value = 1 B Rock’n Roll! Rock’n Roll! THE SYS4U PAPER 2012 | 11
  • 12. II. 동기화 2. 동기화의 조건들 All for One, One for All 완벽한 동기화가 이루어지기 위해서는 원자성, 가시성, 코드 재배치 방지가 모두 보장되어야 한다.. Atomicity Visibility Code Reorder THE SYS4U PAPER 2012 | 12
  • 13. II. 동기화 3. Atomic Wrapper Classes Synchronize without synchronized java.util.concurrent.atomic 패키지에서 제공되는 Atomic* 클래스들은 별도의 동기화 처리가 필요치 않은 동기화 메소드들을 제공한다. 별도의 동기화 작업이 필요치 않다는 점에서 성능 향상을 도모할 수 있지만, 두 개 이상의 Atomic 객체를 사용하는 상황에서는 별도의 동기화 처리가 필요하다. OK, Rock’n Roll! I feel weird… THE SYS4U PAPER 2012 | 13
  • 14. II. 동기화 4. volatile 키워드 내가 너 그럴 줄 알았다. 완벽한 동기화는 가시성, 원자성, 코드 재배치라는 세 가지 요소에 대해 안전하게 처리할 것을 보장해야한다. volatile 키워드는 이들 중 가시성과 코드 재배치에 대한 안전한 처리를 보장한다. 원자성이 보장되어야 할 필요가 없다면 volatile 키워드로 충분하다. OK, Rock’n Roll! I feel weird… THE SYS4U PAPER 2012 | 14
  • 15. II. 동기화 5. synchronized Keyword Perfection requires the hand of time synchronized 키워드는 원자성, 가시성, 코드 재배치 모두를 제어하는 완벽한 동기화 처리를 지원하지만, 완벽한 만큼 더 많은 시간을 필요 로 한다. synchronized 키워드는 메소드 선언부에 사용하여 this 인스턴스에 대해 동기화 할 수 있으며, 이를 암묵적 잠금(implicit lock)이라고 한다. THE SYS4U PAPER 2012 | 15
  • 16. II. 동기화 6. synchronized Keyword(2) 최소 적용으로 최대 효과 synchronized 블럭을 이용하면 더 명시적이고 효과적으로 필요한 부분에 대해서만 동기화를 수행할 수 있다. 필요할 경우 외부에서 접근할 수 없는 private의 잠금용 인스턴스를 이용하여 동기화를 수행할 수도 있다. THE SYS4U PAPER 2012 | 16
  • 17. II. 동기화 7. 명시적 동기화 – Lock / ReentrantLock Everyone is mad but some people can control the madness. JSDK1.4까지는 synchronized 키워드와 volatile 키워드만 사용할 수 있었다.(그나마 volatile은 5.0부터 제대로 동작하게되었다.) JSDK5.0에서 제공되는 Lock 인터페이스는 기존의 방식보다 더 명시적이면서 기존에는 사용하지 못했던 고급 기능을 사용할 수 있게 해 준다.  Unconditional Lock - 좌측의 예제에서와 같이 특별한 조건을 걸지 않 는 경우이다. 기본적으로 synchronized 블럭과 동 일하게 동작한다. Lock 구현체를 이용하는 모든 코드에서는 반드시 try-finally 구문을 이용하여 Lock.unlock()을 수행 하여야 한다.  Timeout Lock - Lock.tryLock(long timeout, TimeUnit unit) 메 소드를 이용하면 일정 시간동안만 lock을 획득하 기 위해 대기할 수 있다.  Interruptible Lock - Lock.lockInterruptibly() 메소드를 이용하면 lock이 외부의 interrupt() 호출에 반응하도록 할 수 있다. THE SYS4U PAPER 2012 | 17
  • 18. III. Executor 프레임워크 1. 왜 Thread의 수를 제한해야 하는가? 2. Executor Interface 3. Callable / Future 4. 진보된 Timeout Job 예제 THE SYS4U PAPER 2012 | 18
  • 19. III. Executor 프레임워크 1. 왜 Thread의 수를 제한해야 하는가? 덮어놓고 낳다보면 거지꼴을 못 면한다. JVM이 사용할 수 있는 자원은 한정되어 있다. 필요하다고 그 때 그 때 만들어 사용하면 여러 가지 문제를 겪을 수 있다.  Thread Life-Cycle 문제 - Thread가 Process보다 경량이긴 하지만, 생성하고 제거하는 데에 적지 않은 자원이 소모된다. 너무 많은 Thread를 생성하게 되면 생 성된 Thread를 관리하는 데에 많은 비용이 든다.  Memory 문제 - (OS마다 다르지만) 보통 Thread 하나를 생성하여 관리하는 데에 256KB~512KB 가량의 메모리가 소비된다. 과도하게 Thread를 생 성할 경우 어플리케이션이 사용할 수 있는 메모리의 양이 제한될 수 있다.  자원의 과도한 사용 - 모든 OS에는 자원(Memory, File Handle, Thread 수) 사용 제한이 있다. 또, JVM의 실행 설정값에 따라 Java 어플리케이션이 이용할 수 있는 자원의 크기도 제한된다. 만약 Java 어플리케이션이 실행되 는 과정에서 자원 제한값을 초과하여 사용하게 되면 OutOfMemoryError가 발생할 수 있으며 이런 종류의 문제는 해결 이 불가능하다.(어플리케이션을 재시작하는 것이 바람직하다.) OutOfMemoryError가 발생하지 않는다 하더라도, 제한 없이 Thread를 생성하는 것은 성능에 악영향을 끼칠 수 있다. THE SYS4U PAPER 2012 | 19
  • 20. III. Executor 프레임워크 2. Executor Interface The Newtype Executor java.util.concurrent.Executor 인터페이스를 이용하면 Thread를 직접 이용하여 병렬처리하는 것보다 훨씬 많은 이익을 얻을 수 있다. 과거 new Thread(Runnable).start();를 이용했던 코드는 모두 Executor를 이용하도록 변경하는 것이 바람직할 정도로 이제는 기본 병렬처 리 기법이라고 말할 수 있다.  Executors.newFixedThreadPool - 고정된 크기의 ThreadPool을 생성한다. 지정된 크기 이상 의 Thread를 할당하는 것이 불가능하다.  Executors.newCachedThreadPool - 기본적으로는 fixed size ThreadPool과 동일하다. 하지만 만약 지정된 크기보다 더 많은 수의 Thread가 필요할 경우 임시로 Thread를 만들어 사용한 뒤 해당 Thread를 제거한다. (고정된 크기가 증가되지는 않는다.)  Executors.newSingleThreadExecutor - 하나의 Thread만 갖는 ThreadPool을 생성한다. 작업이 순 차적(FIFO, LIFO 등)으로 실행되어야 하는 경우에 사용된다.  Executors.newScheduledThreadPool - 기본적으로 fixed size ThreadPool이며, 병렬처리 작업이 지연되거나 특정 시간에 실행될 수 있도록 한다. THE SYS4U PAPER 2012 | 20
  • 21. III. Executor 프레임워크 3. Callable / Future 나는 앞으로 일어날 일을 알고 있다. JSDK5.0부터 제공되는 Callable/Future 구조를 이용하면 병렬처리 작업으로부터 직접 결과를 얻어 사용할 수 있다. 과거에는 병렬처리 작업으로부터 결과를 얻거나 Exception을 전달받기 위해 복잡한 작업을 수행해야 했으나, 이제는 옛 일이 되어 버렸다. THE SYS4U PAPER 2012 | 21
  • 22. III. Executor 프레임워크 4. 진보된 Cancellation 예제 The wise man avoids evil by anticipating it. Callable과 Future를 이용하면 병렬처리 작업을 손쉽게 취소할 수 있다. THE SYS4U PAPER 2012 | 22
  • 23. IV. 더 알아보아야 할 내용들 1. Thread 관련 2. 동기화 관련 3. java.util.concurrent 패키지 관련 THE SYS4U PAPER 2012 | 23
  • 24. IV. 더 알아보아야 할 내용 1. Thread 관련 It was the tip of the iceberg. Thread의 개략적인 사용법 뿐만 아니라 세부적인 개념을 이해할 수 있어야 한다.  Thread Life-Cycle - Thread가 태어난 뒤 어떤 생을 살게 될까?  interruption - Thread를 멈추는 방법은 무엇인가? 멈추라고 하면 정말 멈출까? 멈추기 위해 어떤 작업을 해야 하나?  Deprecated methods - stop, suspend와 같은 메소드들은 왜 deprecated되었을까?  wait – notify / notifyAll - 함부러 기다리라고 했다가는 큰일난다.  Advanced Callable / Future - 미래를 지배하는자! THE SYS4U PAPER 2012 | 24
  • 25. IV. 더 알아보아야 할 내용 2. 동기화 관련 Welcome to hell. Lock을 거는 순간 모든 문제가 발생하기 시작한다.  성능 문제 - 과도한 동기화가 성능에 어떤 영향을 미칠까? 그럼 적절한 동기화는 괜찮나?  데드락(Dead-Lock) - 서로 다른 두 개의 Thread가 각각 상대방의 작업이 종료되기를 기다린다면 어떻게 될까?  자원 고갈(Starvation) - 하나의 Thread가 공유자원을 모두 소비해 버린다면?  객체 공개(Object Publication) - 인스턴스를 잘못된 방식으로 외부에 공개하는 것은 동기화 구조를 깰 수 있다.  재진입성(Reentrancy) - synchronized로 보호되어 있는 동기화 메소드가 자기 자신을 재귀호출한다면 어떻게 될까?  Synchronized Collections - Vector나 Hashtable을 더 이상 사용하지 않는 이유는?  ConcurrentModificationException - Iterator에 대한 작업을 수행하고 있는 과정에서 Collection의 내용이 변경된다면 어떠한 일이 발생할까? THE SYS4U PAPER 2012 | 25
  • 26. IV. 더 알아보아야 할 내용 3. java.util.concurrent 패키지 관련 Abstraction is Simplification. Java Concurrent Library는 과거 직접 만들어 사용해야 했던 수많은 병렬처리/동기화 개념들을 멋지게 추상화하여 사용하기 쉽게 만들었다.  ExecutorService Life-Cycle - ExecutorService의 시작, 실행, 종료, 강제종료, 제거 등은 어떻게 처리되는가?  ThreadPool Sizing - ThreadPool의 크기를 얼마로 할 때 최적의 성능을 발휘할 수 있는가?  CountDownLatch - n개의 Thread가 처리완료될 때까지 기다리고 싶다면?  CyclicBarrier - 특정한 조건이 만족될 때까지 Thread들의 동작을 대기하고 싶다면?  Semaphore - 특정한 자원에 대해 접근이 허용되는 수 n 보다 더 많은 수 m개의 Thread가 동작하고 있다면?  BlockingQueue - ExecutorService를 이용하여 손쉽게 Producer-Consumer 패턴을 구현하고 싶다면?  Fork Join Framework - Callable 내에서 재귀 호출을 하는 것 같이 미래에 일어날 일을 완전히 예측하지 못하는 경우에는 Future를 사용할 수 없을까? THE SYS4U PAPER 2012 | 26
  • 27. V. Q&A THE SYS4U PAPER 2012 | 27
  • 28. VI. References  Java Concurrency in Practice. - Brian Goetz 외 5명(Addison Wesley)  5 things you didn’t know about java.util.concurrent. - Ted Neward(IBM DeveloperWorks)  http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html  http://www.journaldev.com/1090/java-callable-future-example - Pankaj(JournalDev) THE SYS4U PAPER 2012 | 28
  • 29. 감사합니다. THE SYS4U PAPER 2012 | 29