본문 바로가기

Java

Java thread-safe map 비교 들어가면서..Java에서 동시성을 지원하는 Map 구현체로 Collections.synchronizedMap과 ConcurrentHashMap이 있다. 이번글을 통해 두 구현체의 성능 차이와 동기화 방식의 차이를 정리해보겠다. 위 정보를 통해 각자 상황에 맞는 구현체를 선택해 사용했으면 좋겠다. 성능 비교성능 비교를 위해서 JMH(Java Microbenchmark Harness)를 이용했다.(자세한 사용법은 공식 페이지를 통해 확인할 수 있다. https://github.com/openjdk/jmh ) 테스트 조건- 쓰기 연산과 읽기의 비율은 2:8 (서비스의 성격에 따라 다를 수 있지만, 일반적인 상황의 비율로 테스트했다.)- 스레드 10개에서 동시접근 public class MyBenchmark {.. 더보기
Apache HttpClient Connection Pool 모니터링 서비스를 운영하다보면, 외부 api 호출하는 로직때문에 api 응답속도가 느려질때가 종종있다.이럴때 보통 의심할 수 있는 부분이 2가지다. 첫 번째는 외부 api 자체가 응답이 느린지다. 다른 하나는 내 서비스에서 http connection을 얻는데 지연이 생기는지 확인해볼 필요가 있다. 만약 외부 api 호출시 Apache HttpClient를 사용한다면, 지금부터 말하는 내용을 활용해 모니터링 할 수 있다. Apache HttpClientApache HttpComponents – HttpClient OverviewJava 애플리케이션이 HTTP 프로토콜을 통해 다른 웹 서버와 통신할 수 있도록 도와주는 클라이언트 라이브러리를 개발하고 유지하는 Apache 재단의 오픈소스 프로젝트다. Apache .. 더보기
SimpleDateForat 동시성 이슈 SimpleDateFormat 객체를 사용하다 동시성 이슈를 만났다.이슈를 해결한 과정을 기록해 두려고 한다. 문제Jackson Library Custom Deserializer에서 SimpleDateFormat을 이용해 역직렬화 작업 수행 간헐적으로 역직렬화 실패하는 이슈 발생java.lang.NumberFormatException: For input string: ".206E206E22" at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054) at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:11.. 더보기
Java 시간관련 객체 정리 들어가면서 이번 글에서는 Java에서 제공하는 시간과 관련된 Class를 정리한다. 자바 시간 객체 종류 Date public class Date implements java.io.Serializable, Cloneable, Comparable { ... private transient long fastTime; ... } The class {@code Date} represents a specific instant* in time, with millisecond precision. java.util 패키지에 있는 클래스다. 좀 더 쉽게 풀어쓰면 1970년 1월 1일 00:00:00 GMT를 기준으로 지금 몇 milisecond이 지났는지를 저장한다. (이런 개념을 epoch-seconds 라고 부른다... 더보기
람다식 람다식? 람다식(Lambda expression)은 자바에서 제공하는 함수형 프로그래밍 방식이다. (함수형 프로그래밍은 함수의 구현과 호출만으로 프로그램을 만드는 프로그래밍 방식이다) 람다식을 간단하게 설명하자면 이름이 없는 익명 함수를 만드는 것이다. 예시를 통해 람다식에 대해 알아보자. //두 정수를 매개변수로 받아 두 수의 합을 반환하는 함수 ​ //일반적인 함수 선언 int add(int a, int b) { return a + b; } ​ //람다식을 이용한 함수 선언 (int a, int b) -> {return a + b;} 람다식을 보면 소괄호('()') 안에 함수에서 사용될 매개변수가 들어가고, 중괄호('{}') 안에 함수에서 수행할 로직이 들어간다. 그리고 일반적인 함수 선언 방식과 비.. 더보기
익명 클래스 익명 클래스? 익명 클래스란 무엇일까? 이름 그대로 이름 없는(익명) 클래스다. 익명 클래스와 비교해보기 위해 일반(이름이 있는) 클래스는 어떻게 선언하는 다시 생각해보자. class Hello { ... } 위는 이름이 Hello인 클래스를 선언한 예시다. 하지만 익명 클래스는 이렇게 선언하지 않는다. 이름이 없으므로 다른 방식으로 선언한다. 선언 방법은 뒤에서 예시를 통해 알아보겠다. 익명 클래스 사용 이유? 익명 클래스의 의미는 파악했지만 왜? 익명 클래스를 알아야 할까? 프로그래밍을 하다 보면 프로젝트의 전반적으로 사용되는 객체가 존재하고, 어느 부분에서 일시적으로 사용하는 객체가 존재한다. 일시적으로 사용하는 객체의 경우 우리가 굳이 클래스를 정의한 다음 사용해야 할까? 이는 효율적이지 않은 것.. 더보기
Iterator Iterator? Iterator 는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소를 읽어오는 방법을 표준화한 것이다. (추상적이어서 잘 이해가 안 된다.) Iterator 어떻게 생겼을까? 일단 Iterator가 어떻게 생겼는지 확인해 보자. 직접 java 코드를 열어보면 다음처럼 선언되어 있다. public interface Iterator { boolean hasNext(); ​ E next(); ​ default void remove() { throw new UnsupportedOperationException("remove"); } ​ default void forEachRemaining(Consumer 더보기