Java 34

[Java] synchronized, wait() & notify(), volatile, Deadlock

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2392 [Java] 동기화 개념 1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로세스와 하나 이상의 쓰레드로 구성하는 멀티 쓰레드 프로세스로 구분할 수 있습니다,. 멀티 쓰레 jaimemin.tistory.com https://jaimemin.tistory.com/2406 [Java] 동기화 기법 개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드 jaimemin.tistory.com Syn..

[Java] 동기화 기법

개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드가 임계 영역에서 Mutex 객체의 flag를 소유해 락을 획득하면 다른 쓰레드가 접근할 수 없으며 Mutex 객체 flag가 해제 즉, 락이 해제되어야지만 타 쓰레드가 임계 영역에 접근 가능 정리하자면 Mutex 락을 가진 오직 한 개의 쓰레드만이 임계 영역에 진입할 수 있으며 락을 획득한 쓰레드만이 락 해제 가능 코드 부연 설명 임계 영역을 점유하고 있는 쓰레드가 없을 경우 lock은 false lock이 false인 상태에서 쓰레드가 임계 영역에 접근하고자 acquired() 메서드를 호..

[Java] 동기화 개념

1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로세스와 하나 이상의 쓰레드로 구성하는 멀티 쓰레드 프로세스로 구분할 수 있습니다,. 멀티 쓰레드가 항상 좋은 것은 아니며, 자원을 효율적으로 활용하고 성능을 고려한 후에 적절한 방식을 선택해야 합니다. 현재 시중에 나온 CPU는 대부분 멀티코어를 지원하기 때문에 병렬적 성능 및 동시적 자원을 사용하는 관점에서는 대부분 멀티 쓰레드 기반 프로그래밍이 유리한 것은 맞으나 비동기 논블로킹 프로그래밍 같이 싱글 쓰레드 혹은 적은 쓰레드를 활용하는 것이 좋은 성능 및 응답성을 보여줄 수도 있음 1.1 싱글 쓰레드 장점 context switching으로 인한 딜레이가 없음 동시성 문제없음 자원을 적게 사용 앞서 언급한..

[Java] Java 쓰레드 활용

1. UncaughtExceptionHandler 자바 쓰레드의 run() 메서드는 예외를 던질 수 없기 때문에 예외가 발생할 경우 run() 메서드 내에서만 예외를 처리해야 함 RuntimeException이 발생하더라도 쓰레드 밖에서 예외를 잡고 처리하는 방법 없음 자바에서는 쓰레드가 비정상적으로 종료되었거나 특정한 예외를 쓰레드 외부에서 처리할 수 있도록 UncaughtExceptionHandler 인터페이스 제공 해당 인터페이스를 통해 어떤 원인으로 인해 쓰레드가 종료되었는지 대상 쓰레드와 예외를 파악 가능 코드 부연 설명 정적 메서드인 setDefaultUncaughtExceptionHandler() 메서드를 통해 모든 쓰레드에서 발생하는 uncaughtException에 대해 디폴트로 처리하는..

[Java] Java 쓰레드 기본 API

개요 해당 게시글에 앞서 아래 포스팅을 읽고 오시면 이해하는데 도움이 되실 것입니다. https://jaimemin.tistory.com/2369 [Java] 쓰레드 생성 및 실행 구조 개요해당 게시글에 앞서 아래 포스팅을 읽고 오시면 이해하는데 도움이 되실 것입니다. https://jaimemin.tistory.com/2357 [OS] 운영체제 기초Process vs Thread Process 프로그램의 실제 실행을 의미하며 프로그 jaimemin.tistory.com 1. sleep() 1.1 개요 지정된 시간 동안 현재 쓰레드의 실행을 일시 정지하고 Timed Waiting 상태로 빠졌다가 시간이 지나면 Ready To Run 상태로 전환 native 메서드이기 때문에 OS에 위임하며 시스템 콜을 ..

[Java] 쓰레드 생성 및 실행 구조

개요해당 게시글에 앞서 아래 포스팅을 읽고 오시면 이해하는데 도움이 되실 것입니다. https://jaimemin.tistory.com/2357 [OS] 운영체제 기초Process vs Thread Process 프로그램의 실제 실행을 의미하며 프로그램 파일을 실행함으로써 프로그램 데이터들이 메모리에 올라와 CPU를 할당받고 명령을 수행하고 있는 상태 프로세스는 운영체제로jaimemin.tistory.com 자바 쓰레드 개요 및 생성 방법자바 쓰레드는 JVM에서 User Thread를 생성할 때 Kernel Thread와 1:1로 매핑되어 최종적으로 커널에서 관리됩니다.JVM에서 쓰레드를 생성할 때마다 Java Native Interface(JNI)를 통해 커널 영역을 호출하여 자바 쓰레드와 대응하는 커..

[Java] Long, Integer 값 비교는 ==이 아닌 equals로 해야하는 이유

개요 리스트를 Long 타입 id 기준으로 필터링하는데 id 값이 둘 다 203으로 동일한데도 불구하고 빈 리스트가 돌아오는 버그가 발생했습니다. 반면 id 값이 127 이하일 때는 id 값이 같으면 해당 id가 포함된 리스트가 반환되었습니다. 원인 기본적으로 ==은 메모리 주소값을 비교하기 때문에 값이 같더라도 메모리 위치가 다르면 false를 반환합니다. id 값이 127 이하일 때는 equals가 아닌 ==으로 비교해도 정상적으로 동작한 것은 Java에서는 -128부터 127까지의 범위 내에 있는 Integer와 Long 객체를 캐싱하여 동일한 객체로 취급하기 때문입니다. 위와 같이 동작하는 이유는 JVM에서 성능 향상을 위해 수행되는 옵티마이제이션을 진행하기 때문입니다. 해결 방법 제목에서도 명시..

[DEV] 기록 2023.06.23

[Java] 체크 예외 vs 언체크 예외

예외 계층 예외도 객체이기 때문에 Object가 최상위 부모 Throwable이 최상위 예외이며 하위에는 Exception과 Error가 존재 Error는 Out of Memory 혹은 시스템 오류와 같이 애플리케이션 내 복구 불가능한 시스템 예외 이러한 예외는 잡아도 별도로 처리할 수 있는 방법이 없으므로 언체크 예외 가끔 귀찮다고 try catch문을 Throwable로 잡는 경우가 있는데 이럴 경우 Error 예외도 함께 잡을 수 있기 때문에 이러한 코드는 안 좋은 안티 패턴 Exception은 애플리케이션 로직에서 사용할 수 있는 실질적인 최상위 예외이며 잡아서 처리해줘야 하는 체크 예외 Exception의 하위 예외는 모두 컴파일러가 체크하는 체크 예외이지만 RuntimeException의 경우..

면접 준비 2023.04.03

[SpringBoot] Apache poi 버전에 따른 오류들

개요 프로젝트를 진행하면서 Apache Poi 라이브러리 버전이 맞지 않아 아래와 같은 오류가 발생했습니다. java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellType() Found interface org.apache.poi.util.POILogger, but class was expected error 원인 maven 혹은 gradle 내 Apache Poi 버전이 맞지 않아 발생하는 문제였습니다. 해결 방법 두 문제 모두 아래와 같이 버전을 맞춰주면 해결됩니다. org.apache.poi poi 4.1.2 org.apache.poi poi-ooxml 3.15 결국에는 fastexcel로 바꾸긴 했지만 정보 공유 차원에서 게시물..

[DEV] 기록 2023.02.03

[Maven] java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x2fbb01ba) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler)

개요 SpringBoot 프로젝트를 실행하는데 아래와 같은 에러가 발생했습니다. java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x2fbb01ba) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) 원인 pom.xml에 명시된 Java 버전과 lombok 버전 호환성이 맞지 않아 발생하는 문제였습니다. 해결 방법 저 같은 경우 Java 11 버전을 사용하고 있었고 lombok은 별도 version 명시 없이 사용하고 있었는데 Java 11과 호환성이 맞는 버전인..

[DEV] 기록 2023.01.27