☕️ Java

🧐 EnumMap EnumMap은 Java의 Map 인터페이스를 구현한 컬렉션 클래스 중 하나로, Enum 타입의 상수를 효율적으로 처리하기 위해 설계되었습니다. EnumMap은 다른 Map과 달리 특별한 제약사항이 있는데, Map의 키(key)로는 Enum만을 사용할 수 있다는 것입니다. 🧐 EnumMap의 장점 EnumMap은 내부적으로 배열을 사용하기 때문에, 일반적인 Map의 구현체들보다 더 좋은 성능을 가집니다. 또한 HashMap처럼 Key의 충돌이 발생하지 않습니다. 🧐 사용 방법 EnumMap map = new EnumMap(Enum타입.class); // Enum 클래스에 대한 타입토큰 예를 들면 다음과 같습니다. enum Weekday { MONDAY, TUESDAY, WEDNESDAY..
🧐 groupingBy를 통해 동일한 자료의 개수 구하기 Collectors.counting()을 groupingBy의 두 번째 인자로 전달하면 됩니다. 사용 예시는 아래와 같습니다. public void sample(List data) { Map result = data.stream() .collect(Collectors.groupingBy(Function.identity(), counting())); }
Fork-Join 프레임워크의 등장 배경 현재 CPU의 속도의 발전은 한계점에 도달하여, CPU 속도를 향상시키는 것 보다는 코어의 개수를 늘리는 방식을 통해 CPU의 성능을 발전해가고 있습니다. 이러한 하드웨어의 변화에 맞춰 프로그래밍도 멀티 코어를 잘 활용할 수 있는 멀티쓰레드 프로그래밍이 점점 더 중요해지고 있습니다. JDK 1.7 버전(자바 7버전)부터 fork-join(포크 - 조인) 프레임워크가 추가되었고, 이는 하나의 작업을 작은 단위로 나눠 처리하는 분할 정복(divide and conquer) 방식을 통하여 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어줍니다. 포크조인 프레임워크는 어떠한 작업에 대하여 포크(fork)하여 해당 작업이 비동기식으로 실행하기에 충분히 단순해질 때까지 작업을..
Lock 쓰레드를 동기화할 수 있는 또다른 방법으로, 'java.util.concurrent.locks'패키지에서 제공합니다. synchronized 블럭을 사용하면 자동으로 lock이 잠기고 풀리기 때문에 간편하지만 같은 메서드 내에서만 lock을 걸 수 있다는 제약사항과 쓰레들를 구분해서 통지가 불가능하다는 제약사항이 있었습니다. 이럴 때 lock 클래스를 사용할 수 있습니다. 종류 ReentrantLock : 재진입이 가능한 lock. 가장 일반적인 배타적(Exclusive) lock ReentrantReadWriteLock : 읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock : ReentrantReadWriteLock에 낙관적 읽기(Optimistic Reading) lock..
쓰레드의 동기화 멀티쓰레드 프로세스의 경우에는 여러 쓰레드가 같은 프로세스 내의 자원을 공유합니다. 이로 인해 하나의 쓰레드의 작업이 다른 쓰레드에 영향을 주게 됩니다. 이러한 이유로 발생하는 여러 오류를 방지하기 위하여 한 쓰레드가 특정 작업을 끝마치지 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요합니다. 이를 위해 도입된 개념이 바로 임계영역(critical section)과 잠금(락, lock)입니다. 쓰레드 동기화(synchronization) 공유 데이터를 사용하는 코드 영역을 임계 영역으로 지정한 후, 공유 데이터가 각지고 있는 lock을 획득한 단 하나의 쓰레드만 이 영역 내의 코드를 수행할 수 있게 합니다. 그리고 해당 쓰레드가 임계 영역 내의 모든 코드를 수행하고 벗어나서 l..
쓰레드의 실행제어 멀티쓰레드 프로그래밍은 동기화(synchronization)와 스케줄링(scheduling) 등의 여러가지 이유로 어렵습니다. 앞서(https://ttl-blog.tistory.com/791) 우선순위를 통한 쓰레드간의 스케줄링을 하는 방법을 간단히 살펴보았으나, 이것만으로는 너무 부족합니다. 이제부터 우선순위 이외에도 쓰레드의 스케줄링과 관련된 메서드들을 살펴보도록 하겠습니다. sleep - 일시정지 static void sleep(long millis) 지정된 시간 동안 쓰레드를 일시정지시킵니다. 지정된 시간이 지난 이후에는 자동으로 실행대기 상태로 변환됩니다. sleep은 항상 현재 실행 중인 쓰레드에 대해 작동합니다. 이러한 이유로 static으로 선언되어 있으며, 참조변수를 이..
데몬 쓰레드 일반 쓰레드의 작업을 돕는 보조적인 역할을 수행하는 쓰레드를 의미합니다. 여기서 일반 쓰레드란 데몬 쓰레드가 아닌 다른 쓰레드를 의미합니다. 데몬 쓰레드는 단지 일반 쓰레드의 보조 역할만을 수행하므로 일반 쓰레드가 작업을 마치고 종료되었다면 데몬 쓰레드는 남은 작업이 있더라도 그 즉시 종료됩니다. 이외 특성은 일반 쓰레드와 모두 동일합니다. 데몬 쓰레드의 예시로는 GC등이 있습니다. 데몬 쓰레드의 작성 데몬 쓰레드는 기본적으로 무한루프와 조건문을 이용하여 실행 후 대기하다가, 특정 조건이 만족되는 순간에 작업을 수행하고 다시 대기하도록 작성합니다. 데몬 쓰레드의 생성과 실행방법은 일반 쓰레드와 모두 동일하지만, 데몬 쓰레드를 실행하기 전에 setDeamon( true )를 호출하여 데몬 쓰레..
쓰레드의 우선순위 우선순위란 이름 그대로 우선적으로 처리해야할 순서를 정해주는 것입니다. 쓰레드에는 우선적으로 처리해야 하는 작업에 대해 우선순위 속성을 부여할 수 있습니다. 우선순위의 값이 클수록 우선순위가 높아 먼저 처리됩니다. 우선순위는 최대 1~10 사이 범위의 정수입니다. 쓰레드의 우선순위 부여 방법 setPriority ( int newPriority ) setPriority를 통해 쓰레드의 우선순위를 부여할 수 있으며, 우선순위는 getPriority()를 통해 알아볼 수 있습니다. 쓰레드의 우선순위 변경은 start()를 호출하기 전에만 가능하며, 호출한 이후에는 우선순위를 바꾸더라도 아무런 영향이 없습니다. 메인 쓰레드의 우선순위 메인 쓰레드는 5라는 우선순위를 가집니다. 우선순위는 쓰레..
말 랑
'☕️ Java' 카테고리의 글 목록 (2 Page)