스마트웹앱콘텐츠전문가/JAVA

[자바7]동시성

9D4U 2018. 6. 5. 18:12
728x90
반응형

동시성의 정의 :

동시에 다른(또는 같은) 명령을 여러 개 수행하게 하는 프로그램 기능.

동시성 프로그램은 다중 CPU 환경에서 CPU 자원을 분할하여 동작하는 특성이 있음.

동시성 프로그램을 작성해서 오늘날 멀티코어 CPU의 장점을 활용할 수 있고,

싱글코어 CPU 환경에서도 I/O를 많이 사용하는 경우 동시성 프로그램을 작성하는 것이 유리함.


1. 백그라운드 작업 시작하기 : 메인 스레드 밖에서 수행되는 작업이 필요

- Runnable 인터페이스를 구현하고, 신규 스레드를 시작함.

예)

Thread backgroundThread = new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

doSomethingInBackground();

}

}, "Background Thread");


backgroundThread.start();

-> java.lang.Thread 클래스는 현재 스레드와 별개의 새롱누 스레드(실행 경로)에서 코드 실행을 가능하게 함.

   Thread 생성자는 Runnable 인터페이스를 구현한 클래스를 매개변수로 받음.

   Runnable 인터페이스를 구현한 클래스는  public void run() 메서드만 구현하면 됨.

   Thread 인스턴스를 생성했으면 Thread의 start() 메서드를 실행. 

   start() 메서드는 정해진 순서에 따라 새로운 스레드를 생성하고 Runnable의 run() 메서드를 실행함.

cf) JVM(자바 가상 머신) 내에는 두 종류의 스레드가 존재한다.

    - 유저(User) 스레드 : 스레드의 run() 메서드가 종료될 때까지 실행 상태를 유지

  살아 있는 동안 프로그램을 실행하고, 프로그램이 강제 종료되는 것을 막을 수 있음.

    - 데몬(Daemon) 스레드 : 애플리케이션이 종료될 때는 실행 중이라도 강제 종료 가능. JVM 내에 실행 중인 스레드가 모두 데몬 스레드라면

    애플리케이션을 종료할 수 있음.

    보통 종료 조건이 없는 Runnable 인터페이스를 포함. ex) while(true) 반복문 등...

    스레드를 데몬 스레드로 설정하려면, thread.start()메서드를 호출하기 전에 thread.setDaemon(true) 메서드를 호출하면 됨.

 

2. Map 갱신하고 순회하기 : 멀티스레드 환경에서 하나의 Map 객체를 갱신하는 작업 수행.(Map 객체의 일관성 보장)

- Map의 항목을 갱신해야 한다면, ConcurrentMap을 사용 추천.

3. Map에 없는 Key 추가하기 : 일관성을 유지하면서 키가 Map에 없으면 키/값 쌍을 Map에 추가

- ConcurrentMap.putIfAbsent() 메서드를 사용하면 Map이 원자 단위로 수정됐는지 아닌지 확인 가능.

  putIfAbsent() 메서드를 사용해 원자 단위의 단일 작업 내에서 검사와 추가를 수행하여 동시성 문제를 피할 수 있음.

  putIfAbsetn() 키가 이미 Map에 있으면 값을 덮어쓰지 않고, 키가 없으면 값을 설정하는 방식임.(key 값이 없다면 입력 된 key와 value 를 입력, 해당 key가 존재하면 입력 되었던 값 반환)


4. 변경 중인 컬렉션을 순회하기 : 컬렉션의 모든 요소를 전부 순회해야 하는데, 다른 스레드들이 끊임 없이 그 컬렉션을 변경하려 함.

- CopyOnWriteArrayList를 사용하여 동시에 변경될 걱정 없이 안전하게 컬렉션을 순회할 수 있음.



- synchronizedList()를 사용하여 원자 단위 연산으로 컬렉션을 변경할 수 있음. 

  또한 synchronizedList()는 리스트를 전부 순회하는 동안 안전하게 동기화하는 방법을 제공함.

5. 다양한 컬렉션 조작하기 : 서로 다르지만 연관된 여러 컬렉션을 동시에 수정하고 싶음. 그리고 이 수정 작업을 완료하기 전에 다른 스레드가 작업 중인 컬렉션에

    절대 접근하지 못 하게 하고 싶음.

- 관리 대상인 컬렉션을 락으로 동기화

5. 개별 스레드에 작업을 나눠주기 : 개별 스레드에 작업을 나눠줘서 CPU 자원 사용률을 최대로 끌어 올리고 싶음

- ThreadPoolExecutor 인스턴스를 사용하면 작업을 서로 독립된 단위로 쪼갤 수 있음.

728x90

'스마트웹앱콘텐츠전문가 > JAVA' 카테고리의 다른 글

공백 제거  (0) 2019.02.21
URL 유효성 검사  (0) 2019.02.21
[java7]이메일  (0) 2018.05.30
[자바7]입출력  (0) 2018.05.29
[자바7]숫자와 날짜  (0) 2018.05.28