CodeGym
학습
강좌
과제
설문 & 퀴즈
게임
도움말
일정
커뮤니티
사용자
포럼
채팅
아티클
성공 사례
활동
후기
구독
라이트 테마

강의

  • 리뷰
  • 회사 소개
시작
학습 시작
Start learning now
  • 진행 상황
  • 코스
  • 퀘스트 맵
  • 레슨
  • Deadlock: 원인, 예시, 해결

    JAVA 25 SELF
    레벨 53,레슨 0
    이 강의에서는 Java에서의 스레드 상호 교착 상태(deadlock)가 무엇인지, 왜 발생하는지, 그리고 이를 위해 필요한 네 가지 조건이 무엇인지 살펴봅니다. 실습 예제로 synchronized를 사용해 문제를 재현한 뒤, 예방 전략을 학습합니다: 자원 획득의 일관된 순서, 타임아웃이 있는 ReentrantLock.tryLock 사용, 임계 구역 축소, 불필요한 중첩 락 지양. 또한 Thread Dump와 jstack을 통한 진단, BLOCKED/ WAITING 상태 식별 방법을 보여주고, 체크리스트와 흔한 실수로 마무리합니다.
    사용 가능
  • Livelock과 Starvation: 정의와 예시

    JAVA 25 SELF
    레벨 53,레슨 1
    경쟁 상태의 이상 동작인 Livelock과 Starvation을 살펴봅니다: Deadlock과 무엇이 다른지, 코드와 로그에서는 어떻게 보이는지. Java 예제 포함: “예의 바른 작업자들”(활성 교착, livelock)과 우선순위, 불공정 락 때문에 생기는 기아. 문제를 발견하는 법(로깅, Thread dump, VisualVM, Java Mission Control)과 예방하는 법: 재시도 전 랜덤 지연 추가( Thread.sleep), 논블로킹 알고리즘, ReentrantLock의 fairness 플래그( new ReentrantLock(true))로 공정 락 사용, 신중한 임계 구역 설계, setPriority()와 synchronized 남용 지양.
    사용 가능
  • 스레드 안전 컬렉션: ConcurrentHashMap 및 기타

    JAVA 25 SELF
    레벨 53,레슨 2
    이 강의에서는 일반 컬렉션 ( ArrayList, HashMap)이 멀티스레드 환경에서 왜 위험한지, 그리고 패키지 java.util.concurrent가 제공하는 스레드 안전한 대안들인 ConcurrentHashMap, CopyOnWriteArrayList, ConcurrentLinkedQueue, 스킵 리스트 기반 구조와 BlockingQueue를 살펴봅니다. merge, putIfAbsent, computeIfAbsent 같은 원자적 연산을 논의하고, Collections.synchronizedMap과 비교하며, 실전 예제와 흔한 실수들(약한 일관성 이터레이터, 비원자적 연산 시퀀스 등)도 다룹니다.
    사용 가능
  • AtomicInteger, AtomicReference: 원자적 연산

    JAVA 25 SELF
    레벨 53,레슨 3
    왜 인크리먼트 i ++가 멀티스레드에서 제대로 동작하지 않는지, 원자적 연산이 무엇이며 이를 java.util.concurrent.atomic 패키지가 어떻게 제공하는지. AtomicInteger와 AtomicReference, incrementAndGet(), compareAndSet(...) 메서드, 내부 메커니즘 CAS(Compare-And-Swap), 그리고 언제 synchronized를 선택하고 언제 — LongAdder를 선택하는 것이 좋은지까지 다룹니다. 마지막에는 전형적인 실수들 — 복합 연산, ABA 문제, 중첩 객체의 스레드 안전성 — 을 정리합니다.
    사용 가능
  • 멀티스레드 프로그램의 진단과 디버깅

    JAVA 25 SELF
    레벨 53,레슨 4
    Thread Dump를 jstack, VisualVM 및 IDE로 찍고 읽는 방법, 스레드 상태( RUNNABLE, BLOCKED, WAITING)를 식별하고 상호 교착을 찾는 법을 다룹니다. 또한 Java Mission Control과 Java Flight Recorder에서의 스레드 모니터링, 로깅 실무(스레드 이름, synchronized 진입/이탈), 락 최소화, CountDownLatch로 동시성 테스트, 실제 데드락 케이스 분석을 살펴봅니다. 마지막에는 흔한 실수와 피하는 방법을 정리합니다.
    사용 가능
  • 병렬 처리 입문

    JAVA 25 SELF
    레벨 54,레슨 0
    이 강의에서는 멀티스레딩과 병렬 처리의 차이를 다룹니다: 어디에서 응답성이 중요하고, 어디에서 여러 코어에서의 실제 가속이 중요한지. Thread로 스레드를 생성하고, Runnable을 구현하며, 고수준 풀인 ExecutorService를 사용하는 방법을 살펴봅니다. 또한 배열 합산의 간단한 예제를 보고, 병렬 처리가 언제 도움이 되고 언제 방해가 되는지, 그리고 대표적인 문제들(데이터 레이스, synchronized를 통한 동기화, 교착 상태, 부하 분산)을 정리합니다. 마지막에는 비교 표와 시나리오 시각화를 제공합니다.
    사용 가능
  • ExecutorService, Callable, Future: 작업 실행

    JAVA 25 SELF
    레벨 54,레슨 1
    진짜 같은 멀티스레딩 실습: 수동으로 Thread를 만들기보다 ExecutorService에 작업을 제출하고, 풀, 큐, 생명주기( shutdown(), shutdownNow())를 관리합니다. Runnable과 Callable<T>의 차이를 이해하고, Future와 그 메서드들( get(), isDone(), cancel(...), isCancelled())로 결과를 받습니다. 여러 작업 실행, invokeAll/ invokeAny, ExecutionException 처리와 흔한 실수를 보여줍니다.
    사용 가능
  • 병렬 스트림: 문법과 활용

    JAVA 25 SELF
    레벨 54,레슨 2
    한 줄로 일반 스트림을 병렬 처리로 전환하는 방법 — parallelStream() 또는 .parallel() 호출, ForkJoinPool.commonPool() 내부에서 일어나는 일, 언제 병렬성이 실제로 계산을 가속하는지(큰 컬렉션, ‘무거운’ 연산)와 언제 오히려 느려질 수 있는지를 살펴봅니다. 필터링, 집계, 정렬, 성능 측정 예제를 보여 주고, 전형적인 실수도 정리합니다: forEach에서의 부작용, 순서 유지, 컬렉션 선택, 병렬성 수준 설정.
    사용 가능
  • ForkJoinPool 및 RecursiveTask: 재귀 작업

    JAVA 25 SELF
    레벨 54,레슨 3
    Java에서의 병렬 계산에 대한 실습 가이드: 작업 풀 ForkJoinPool과 재귀 작업 RecursiveTask<T>/ RecursiveAction이 어떻게 동작하는지, work-stealing 알고리즘이 왜 유용한지, fork()로 작업을 분할하고 compute() 내부에서 join()으로 결과를 결합하는 방법을 다룹니다. 또한 pool.invoke()로 실행하는 법, 배열 합계 계산과 최댓값 탐색 예제, parallelStream()에서의 ForkJoinPool의 위치, 그리고 흔한 실수와 피하는 방법까지 설명합니다.
    사용 가능
  • 병렬 프로그래밍 모범 사례

    JAVA 25 SELF
    레벨 54,레슨 4
    Java에서의 병렬 프로그래밍 실전 가이드: 언제 ExecutorService를 써야 하고, 어디서 parallelStream이 도움이 되며, 어떤 작업에 ForkJoinPool이 필요한지. ConcurrentHashMap/ CopyOnWriteArrayList와 같은 thread-safe 컬렉션 및 AtomicInteger 같은 원자적 클래스와 함께 스레드 안전성을 논의하고, System.nanoTime()과 JMH로 성능 측정, Future.get()과 ForkJoinTask에서의 오류 처리, InterruptedException에 대한 올바른 대응, 그리고 로깅( Thread.currentThread().getName())과 테스트( Awaitility) 팁을 다룹니다. 마지막에는 도구 선택 표와 흔한 실수를 정리합니다.
    사용 가능
  • CompletableFuture 입문

    JAVA 25 SELF
    레벨 55,레슨 0
    이 강의에서는 왜 동기 코드가 블로킹을 유발하는지, Future의 제약(블로킹 get() 등)은 무엇이었는지, 그리고 java.util.concurrent 패키지의 CompletableFuture 클래스가 비동기 작업 방식을 어떻게 바꾸는지 살펴보겠습니다. 또한 supplyAsync로 백그라운드에서 작업을 시작하고, thenAccept/ thenApply로 결과를 구독하는 법, ForkJoinPool의 역할과 흔한 실수들—메인 스레드에서 get()/ join()을 호출하는 것, exceptionally/ handle로 오류를 처리하지 않는 것 등을 연습합니다.
    사용 가능
  • 비동기 작업: thenApply, thenAccept, thenRun

    JAVA 25 SELF
    레벨 55,레슨 1
    CompletableFuture를 사용해 비동기 계산을 시작하고 구성하는 방법을 살펴봅니다: supplyAsync와 runAsync로 작업을 시작하는 법, 처리기 thenApply, thenAccept, thenRun의 차이점, 그리고 이들의 비동기 버전 thenApplyAsync/ thenAcceptAsync/ thenRunAsync를 언제 선택할지. 실행 스레드( ForkJoinPool 또는 여러분의 Executor), 결과 타입( CompletableFuture<T>, CompletableFuture<Void>)과 흔한 실수도 다룹니다: 블로킹하는 get()/ join(), exceptionally/ handle/ whenComplete 없이 처리되지 않은 예외, 그리고 thenRun 내부에서 결과를 사용하려는 시도 등.
    사용 가능
  • 1
  • ...
  • 23
  • 24
  • 25
  • 26
  • 27
  • ...
  • 30
학습
  • 등록
  • Java 과정
  • 과제 도움
  • 요금
  • Java 문법
커뮤니티
  • 사용자
  • 아티클
  • 포럼
  • 채팅
  • 성공 사례
  • 활동
  • 제휴 프로그램
회사
  • 회사 소개
  • 연락처
  • 후기
  • 보도자료실
  • CodeGym for EDU
  • FAQ
  • 지원
CodeGymCodeGym 은(는) 처음부터 Java 프로그래밍을 배우기 위한 온라인 코스입니다. 이 과정은 초보자가 Java를 마스터하기에 완벽한 방법입니다. 즉시 검증 기능이 포함된 1200개 이상의 과제와 Java 기초 이론의 필수 범위를 제공합니다. 학습 성공을 돕기 위해 퀴즈, 코딩 프로젝트, 효율적인 학습법 관련 콘텐츠, Java 개발자 경력 관련 자료 등 동기 부여 기능들을 구현했습니다.
팔로우하기
인터페이스 언어
English Deutsch Español हिन्दी Français Português Polski বাংলা 简体中文 मराठी தமிழ் Italiano Bahasa Indonesia 繁體中文 Nederlands 日本語
한국어
Bulgarian Danish Hungarian Basa Jawa Malay Norwegian Romanian Swedish Telugu Thai Українська Filipino Turkish Azərbaycan Русский Vietnamese
"Programmers Are Made, Not Born" © 2026 CodeGym
MastercardVisa
"Programmers Are Made, Not Born" © 2026 CodeGym