본문 바로가기

Java5

스레드 풀(Thread pool) 제대로 이해하기 Thread per request model 백엔드 API 서버에서 요청을 처리하는 여러가지 방식이 있는데 그 중 하나가 Thread per request model 이다. Thread per request model 에서는 하나의 API Request 는 하나의 Thread가 처리하게 되는 구조다. 만약 Thread per request 모델의 동작 방식이 서버에서 들어오는 요청마다 스레드를 새로 만들어서 처리하고 처리가 끝난 스레드는 버리는 식으로 동작한다면 어떤 문제점이 있을까? 우선 스레드 생성/수거 작업은 OS의 kernel 레벨에서 이루어지는 꽤나 비싼 작업이다. 따라서 요청이 올때마다 스레드를 생성하게 되면 스레드 생성에 소요되는 시간 때문에 요청 처리가 더 오래 걸릴 것이다. 또한 요청마다.. 2023. 9. 10.
Java에서 Enum 의 비교는 '==' 인가? 'equals' 인가? 자바에서 Enum은 클래스의 인스턴스가 JVM 내에 하나만 존재한다는 것이 100% 보장되는 싱글톤을 만드는 가장 좋은 방법입니다. (JLS, 8.9 Enum Types) 그렇다면 Enum 비교시 equals 메서드 대신 간단히 == 비교를 사용하면 어떨까요? 1. == 비교는 NullPointerException을 발생시키지 않습니다. enum Color { BLACK, WHITE }; Color nothing = null; if (nothing == Color.BLACK); // runs fine if (nothing.equals(Color.BLACK)); // throws NullPointerException equals 메서드를 사용해 비교하면 런타임에 NullPointerException가 발생.. 2022. 3. 20.
자바와 다중상속 문제 다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 '다중상속(multiple inheritance)' 을 허용하지만 자바에서는 오직 단일 상속만을 허용합니다. 사실 다중상속 문제는 수년동안 논쟁의 여지가 있는 문제로 다루어져 왔습니다. 지금부터 다중 상속의 가장 대표적인 문제로 꼽히는 다이아몬드 문제(Diamond Problem) 을 통해서 그 이유에 대해 살펴보겠습니다. The diamond problem 다음과 같이 추상 메서드를 가진 Sample 추상 클래스가 있습니다. public abstract class Sample { public abstract void demo(); } 여기서Sample 클래스를 상속받아 demo 메서드를 구현하는 두 개의 클래스가 있습니다. p.. 2022. 1. 8.
자바8 람다식의 등장 자바8에서 함수형 인터페이스, 람다와 같은 개념이 추가되면서 함수 객체를 더 쉽게 만들 수 있게 되었습니다. 간단한 프로그램을 기존 자바 코드로 해결하면서 발생하는 문제를 자바8에서 새롭게 추가된 개념들을 이용해 어떻게 개선할 수 있는지 비교해볼 예정입니다. 예제 1. 과일 재고 프로그램 과일 재고 목록을 관리하는 애플리케이션을 만들어보겠습니다. 최초 요구사항은 "녹색 사과를 모두 찾고싶다" 입니다. 코드는 다음과 같습니다. public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if ("green".equals(apple.getColor())) { .. 2022. 1. 2.
동기화(synchronization)와 Thread Safe 제대로 이해하기 싱글스레드 프로세스의 경우 프로세스 내에서 단 하나의 스레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는데 별문제가 없지만, 멀티스레드 프로세스의 경우 여러 스레드가 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로의 작업에 영향을 주게 됩니다. 한 스레드가 진행 중인 작업을 다른 스레드가 간섭하지 못하도록 막는 것을 '스레드의 동기화(synchronization)'라고 합니다. 자바의 synchronized 키워드를 이용하면 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장합니다. 다시 말해서 스레드의 배타적 실행을 보장합니다. 여기까지는 알고 있었던 동기화에 대한 개념이었습니다. 그러나 이펙티브 자바(Effective Java)의 아이템 78을 읽다보면 이런 내용이 나옵니다. 동.. 2021. 12. 26.
반응형