Day12

피오·2021년 11월 16일
0
post-thumbnail

Map

자바의 컬렉션 프레임워크 중 하나이다.
Map의 각 요소는 Keys와 Values가 한 쌍으로 매핑되어있으며, 키는 중복을 허용하지 않고 값은 중복 허용한다.
Map은 원래 요소의 순서를 보장하지 않지만, Map의 구현체중 TreeMap은 정렬 순서를 보장한다.

HashTable과 HashMap

  • HashTable
    • HashTable은 HashMap의 구버전. 모든 메서드가 동기화(Sysncronized) 메서드로 구현되어있어 멀티 스레드 환경에서도 데이터의 일관성을 보장한다.
    • 멀티쓰레드가 아닌 경우에도 불필요하게 동기화 기능을 계속 사용하므로 성능 저하를 유발한다.
  • HashMap
    • HashMap은 메서드가 비동기이므로 데이터의 일관성을 보장하지 않는다.
    • 동기화가 필요한 경우 Collections클래스의 synchronized메서드를 이용하면 데이터 일관성을 유지할 수 있다.
ex)
Map<K, V> syncMap = Collections.synchronizedMap(new HashMap<K,V>(...));

ConcurrentHashMap

HashTable과 동일한 기능을 가지고 있는 클래스이다. 딱 하나 차이가 있는데, HashMap에는 없는

computeIfAbsent(K key, @NotNull java.util.function.Function<? super K, ? extends V> map)

라는 메서드가 존재한다. 해당 메서드는 입력된 key와 매치되는 value가 있을 경우 value를 리턴하고, 없을시엔 key와 value를 map에 저장한 후, value를 리턴한다.

Map<String, String> concurrentHashMap = new ConcurrentHashMap<>();
//"hi"라는 키와, 이 키에 대응되는 값이 들어간 적이 없으니 저장후, value인 "there"를 리턴
System.out.println(concurrentHashMap.computeIfAbsent("hi", k -> "there")); //there


쓰레드

프로세스란?

실행 중인 프로그램. OS로부터 실행에 필요한 자원(메모리)을 할당받는다.

쓰레드

프로세스의 자원(데이터, 메모리 등)을 이용해서 실제로 작업을 수행하는 주체.
각 쓰레드는 개별적인 메모리 공간(호출스택)을 필요로 한다.

멀티쓰레딩

하나의 프로세스에 여러 쓰레드가 동시에 작업을 수행하는 것.

  • 장점
    • CPU사용률 향상
    • 자원을 보다 효율적으로 사용
    • 사용자에 대한 응답성 향상
    • 작업이 분리되어 코드가 간결
  • 단점
    • 여러 쓰레드가 프로세스 자원을 공유하면서 발생하는 동기화 문제
    • 교착상태
    • 각 스레드가 고르게 실행되지 못할 수 있음

자바에서 쓰레드 구현

Thread클래스를 상속받는 방법과 Runnable인터페이스를 구현하는 방법 두 가지가 존재. Runnable인터페이스 구현이 일반적.

class Thread_Ex1 extends Thread {
  public void run() {  //Runnable 인터페이스의 run메서드 구현
    ... 작업 내용 ...
  }
}

class Thread_Ex2 implements Runnable {
  public void run() {
    ... 작업 내용 ...
  }
}

 //클래스를 상속했을 때 
Thread_Ex1 t1 = new Thread_Ex1();

//인터페이스를 구현했을 때. 생성자로 Runnable 타입을 인자로 받는다.
Thread t2 = new Thread(new Thread_Ex2()); 

쓰레드 실행

쓰레드를 실행할 때 쓰레드 인스턴스.run()이 아니라 start()를 호출해야 한다.

t1.start(); //쓰레드 생성 후 실행 대기상태가 되고, OS의 스케줄러가 실행순서를 결정. 
t1.run(); //쓰레드 생성X 

start()메서드를 호출해야만 쓰레드가 새로 생성되고, 이후에 새로 생성된 쓰레드의 호출스택 내에서 run()메서드가 실행된다.
만약 start()메서드를 호출하지 않고 직접 run()을 호출한 경우 쓰레드가 새로 생성되지 않고 기존 쓰레드의 호출스택에 쓰레드 인스턴스의 run() 메서드를 호출하여 스택을 쌓고 작업이 끝나면 스택을 비워낼 뿐이다.

싱글 쓰레드와 멀티쓰레드

synchronized

profile
블로그 이전했습니다. https://pzbg.tistory.com/

0개의 댓글