자바의 컬렉션 프레임워크 중 하나이다.
Map의 각 요소는 Keys와 Values가 한 쌍으로 매핑되어있으며, 키는 중복을 허용하지 않고 값은 중복 허용한다.
Map은 원래 요소의 순서를 보장하지 않지만, Map의 구현체중 TreeMap은 정렬 순서를 보장한다.
ex)
Map<K, V> syncMap = Collections.synchronizedMap(new HashMap<K,V>(...));
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로부터 실행에 필요한 자원(메모리)을 할당받는다.
프로세스의 자원(데이터, 메모리 등)을 이용해서 실제로 작업을 수행하는 주체.
각 쓰레드는 개별적인 메모리 공간(호출스택)을 필요로 한다.
하나의 프로세스에 여러 쓰레드가 동시에 작업을 수행하는 것.
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() 메서드를 호출하여 스택을 쌓고 작업이 끝나면 스택을 비워낼 뿐이다.