728x90 Language/JAVA18 [자바 멀티스레딩] 자바 동시성 고급: ConcurrentHashMap 사용법 ConcurrentHashMap 은 멀티스레드 환경에서 데이터를 안전하고 효율적으로 관리할 때 자주 사용하는 클래스다.예로, 웹 서버에서 사용자 요청 수를 집계하거나 캐시 데이터를 저장할 때, 데이터 충돌 없이 빠르게 동작한다. ConcurrentHashMap- 동시성 환경에서 안전한 해시맵 구현체- Java8 부터는 CAS(Compare And Swap) 와 세밀한 락으로 동시성 최적화.- 읽기는 락 없이, 쓰기는 최소 범위만 락 걸림- 기본 초기 용량값은 16 사용목적- 멀티스레드 환경에서 데이터 일관성 유지 및 성능 향상 주요메서드- put(K key, V value): 키-값 쌍 추가 또는 갱신- get(Object key): 키로 값 조회- remove(Object key): 키-값 쌍 삭제-.. 2025. 4. 1. [자바 멀티스레딩] 자바 동시성 고급: CountDownLatch 사용법 CountDownLatch 는 스레드 간 동기화를 위해 특정 조건이 완료될 때까지 대기하는 도구이다. 목적- 여러 스레드가 작업을 끝낸 후 다음 단계를 진행하도록 보장 동작원리- 초기 카운트를 설정하고, 각 작업 완료 시 countDown() 으로 카운트 감소- await() 호출 스레드는 카운트가 0이 될 때까지 블록 주요 메서드- CountDownLatch(int count): 초기 카운트 설정. 작업 수에 맞게 지정- await(): 카운트가 0이 될 때까지 대기- await(long timeout, TimeUnit unit): 타임아웃 설정 후 대기- countDown(): 카운트 1 감소. 0이 되면 대기 해제- getCount(): 현재 카운트 조회 장점- 단순성 : 락보다 직관적이며, 작업.. 2025. 3. 31. [자바 멀티스레딩] 자바 동시성 고급: ReentrantLock 사용법 ReentrantLock 은 syncronized 보다 유연한 동기화 도구이다.세밀한 제어가 간으하며, 인터럽트 처리를 지원한다. 또한 락 상태 확인이 가능하다. ReentrantLock- 같은 스레드가 락을 여러 번 획득 가능하며, 획득 횟수만큼 해제 필요- ReentrantLock(true) 로 공정모드 설정. 대기 순서 보장(성능 저하 가능)- Condition 객체로 특정 조건 기다림- tryLock(long, TimeUnit) 으로 락 획득 시간 제한 가능 - 세밀한 제어 가능하며 인터럽트 처리를 지원- 코드 복잡도가 증가하며, unlock() 메서드 누락 시 데드락 위험 public class LockCounter { private int count = 0; private fina.. 2025. 3. 30. [자바 멀티스레딩] 동시성 제어: volatile 사용법 volatile 은 변수의 가시성을 보장하고 동시성 문제를 해결할 수 있다. volatile- 변수의 값을 스레드 간 최신 상태로 유지한다.- 캐시 대신 메인 메모리에서 읽고 쓴다.- 간단한 플래그나 상태 변수에 유용하다. 사용하는 이유- 스레드가 변수 값을 캐시에 저장하면 다른 스레드에서 변경된 값이 보이지 않는다.- 메모리 가시성을 보장한다.- 복잡한 동기화는 synchronized 필요 public class VolatileExample { private boolean running = true; public void stop() { running = false; } public static void main(String[] args) throws Interrup.. 2025. 3. 28. [자바 멀티스레딩] 동기화: synchronized 과 AtomicInteger 사용법 synchronized로 스레드 간 경쟁 상태(race condition) 을 방지할 수 있다. 동기화- 여러 스레드가 같은 자원에 접근하면 데이터 불일치 발생 가능- 동기화로 스레드가 순차적으로 자원 접근하도록 제어- Java에서는 synchronized 을 사용해 구현 가능 synchronized- 메서드나 블록에 적용해 락(Lock) 설정- 한 스레드가 락을 가진 동안 다른 스레드는 대기- 락 해제 시 다음 스레드 실행 - 과도한 synchronized는 병렬성이 저하되어 성능 문제 가능성 있음- 데드락 : 여러 락 사용 시 교착 상태 주의 synchronized 를 사용하지 않고 경쟁 상태 발생할 경우public class Counter { private int count = 0; p.. 2025. 3. 28. [자바 멀티스레딩] 스레드 풀: ExecutorService 사용법 ExecutorService 를 사용해서 스레드를 효율적으로 관리할 수 있다. 스레드 풀- 매번 스레드를 새로 생성하면 오버헤드가 크다.- 미리 스레드를 만들어 놓고 재사용하는 방식을 사용한다.- 작업을 큐에 넣으면 스레드 풀에서 꺼내 실행한다.- 스레드 생성/소멸 비용을 줄이고, 시스템 자원 관리를 효율적으로 가능하다. ExecutorService- 스레드 풀을 관리하는 자바 유틸리티- Executors 클래스로 생성 가능 - 작업은 submit() 메서드로 큐에 추가- 스레드 수 제한 가능, 작업 대기열 관리, 종료 제어 가능 예제- 2개 스레드가 번갈아 작업 처리- 결과값은 다를 수 있음 (스케줄링에 따라 다르다) import java.util.concurrent.ExecutorService;imp.. 2025. 3. 27. [자바 멀티스레딩] 스레드 기초: Thread 클래스와 Runnable 인터페이스 스레드- 프로세스 내에서 실행되는 작업의 단위- CPU를 활용해서 여러 작업을 동시에 처리 가능- Java에서는 스레드를 통해 멀티태스킹 구현 가능 Thead 클래스- 자바에서 스레드를 직접 생성하는 기본 방법 - Thread를 상속ㅂ다아 run() 메서드를 오버라이드 Runnable 인터페이스- 스레드 실행 로직을 분리해서 정의하는 방법- run() 메서드만 구현하면 되고, 더 유연하게 사용 가능 (다중 상속) public class Task1 { static class MyThread extends Thread { @Override public void run() { for (int i = 0; i Hello, Thread!"); .. 2025. 3. 26. Null , isEmpty , isBlank 비교 요약 Null : 인스턴스가 생성되지 않은 상태 ( 참조 타입 발생 ) isEmpty : 길이가 0 인 상태면 true isBlank : 문자열이 비어있거나, 빈 공백으로 이루어져 있는 상태면 true 참고 : 검색조건 등 (유효성검사) 에는 StringUtils 의 hasText를 유용하게 사용한다. -> 스프링에서 지원 null 체크, 빈문자열 , 포함여부 모두 && 조건으로 확인한다. null - 참조형의 기본값 - 어떠한 값으로도 초기화 되지 않는 상태 참조형(Reference Type) 은 값을 설정하지 않으면 초기화가 자동으로 null 로 진행된다. 참조타입 : 원시타입을 제외한 타입으로, 객체의 주소를 저장하는 타입. 따라서 아래 테스트 처럼 NPE 를 발생시킨다. @Test @Display.. 2024. 3. 20. [JAVA] 깊은 복사 vs 얕은 복사 깊은 복사 vs 얕은 복사 #Java 참고 : [Java] - 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy) 깊은 복사 : ‘실제 값’을 새로운 메모리 공간에 복사하는 것 얕은 복사 : ‘주소 값’을 복사 → 참조하고 있는 실제값은 같다. Collection 은 clone() 이라는 메서드를 이용해서 얕은 복사를 만들 수 있다. 깊은 복사를 구현하는 방법은 여러가지 Cloneable 인터페이스 구현 복사 생성자 복사 팩터리 Cloneable 을 사용하지 말자. Cloneable 인터페이스는 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도한 목적을 제대로 이루지 못했다. 여기서 큰 문제점은 clone 메서드가 선언된 곳이 Cloneable이 아닌 OB.. 2023. 8. 20. 이전 1 2 다음 728x90