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

강의

  • 리뷰
  • 회사 소개
시작
학습 시작
Start learning now
  • 진행 상황
  • 코스
  • 퀘스트 맵
  • 레슨
  • Scoped Values 및 새로운 스레드 메커니즘 (Java 21+)

    JAVA 25 SELF
    레벨 57,레슨 4
    고전적인 ThreadLocal이 가상 스레드 환경에서 왜 덜 적합해지는지, 그리고 그 대안으로 ScopedValue가 어떻게 등장하는지 살펴봅니다: 스레드가 아니라 실행 영역에 묶이는 컨텍스트. 컨텍스트 전달의 단계별 예시(사용자, REQUEST_ID), 중첩 scope와 그 덮어쓰기, 가상 스레드와의 통합( Executors. newVirtualThreadPerTaskExecutor()). ThreadLocal vs ScopedValue 비교, 실전 팁, 제약사항, 그리고 Structured Concurrency(preview)에 대한 관점을 논의합니다.
    사용 가능
  • Structured Concurrency

    JAVA 25 SELF
    레벨 58,레슨 0
    Structured Concurrency는 제각각인 스레드 모음을 관리 가능한 작업 계층으로 바꿉니다: StructuredTaskScope 안에서 가상 스레드로 하위 작업을 실행하고, join()으로 기다리며, throwIfFailed()로 오류를 중앙에서 처리하고, resultNow()/ result()로 결과를 받습니다. 종료 정책 ShutdownOnFailure와 ShutdownOnSuccess를 살펴보고, CompletableFuture와 비교하며, HTTP 집계기 예제와 구조화된 동시성 사용 시 흔한 실수를 확인합니다.
    사용 가능
  • 스택 전반에서의 작업 취소와 타임아웃

    JAVA 25 SELF
    레벨 58,레슨 1
    Java에서 오래 실행되거나 블로킹되는 연산을 올바르게 취소하는 방법: Thread.interrupt()를 통한 협력적 인터럽트, Future.cancel()로 작업을 취소할 때와 CancellationException의 동작, CompletableFuture의 타임아웃 및 취소( orTimeout, completeOnTimeout), StructuredTaskScope로 구현하는 구조화된 동시성, 공통 데드라인(time‑budget)과 타임아웃을 스택 아래로 전파하는 방법( Instant/ Duration 및 Scoped Values 포함). 블로킹 IO를 다룰 때의 실무와 흔한 실수를 정리합니다.
    사용 가능
  • 고수준 동기화 장치

    JAVA 25 SELF
    레벨 58,레슨 2
    이 강의에서는 java.util.concurrent의 고수준 동기화 장치인 CountDownLatch, CyclicBarrier, Phaser, Exchanger를 다룹니다. await()/ countDown()으로 작업의 시작과 종료를 조율하고, await()으로 재사용 가능한 단계와 배리어 동작을 구성하며, register()/ arriveAndAwaitAdvance()/ arriveAndDeregister()로 “오케스트라”의 동적 참여자를 관리하고, exchange()로 1:1 데이터 교환을 수행합니다. 실습에서는 워커의 대량 동시 시작과 “게임 틱”을 구현하고, 전형적인 실수도 살펴봅니다: CountDownLatch의 일회성, BrokenBarrierException 처리, 올바른 deregister(). 전반적으로 wait()/ notify()의 고통 없이 해결합니다.
    사용 가능
  • StampedLock과 저경합 카운터

    JAVA 25 SELF
    레벨 58,레슨 3
    ReentrantReadWriteLock과 고전적인 ReadWriteLock이 높은 부하에서 발목을 잡기 시작하면, 낙관적 읽기를 제공하는 StampedLock이 도움이 됩니다: tryOptimisticRead + validate 조합은 쓰기가 드문 상황에서 거의 “공짜”에 가까운 읽기를 제공합니다. 락 모드, 스탬프(stamp)로 작업하는 방법, 재진입성(reentrancy) 제약을 살펴보고 ReentrantReadWriteLock과 비교한 뒤, 저경합 카운터인 LongAdder와 LongAccumulator가 경쟁 상황에서 AtomicLong을 앞서는 이유를 봅니다. 마지막은 실습: 읽기 우위 캐시와 미니 벤치마크.
    사용 가능
  • Java Memory Model (JMM)

    JAVA 25 SELF
    레벨 58,레슨 4
    Java Memory Model에서의 가시성과 연산 순서 규칙을 살펴봅니다: happens-before 관계가 무엇을 의미하는지, volatile, synchronized, 최종 필드( final)가 언제 어떻게 도움이 되는지, 그리고 그것들이 없을 때 왜 “stale”(신선하지 않은) 데이터가 생기는지를 설명합니다. 객체의 안전한 퍼블리시, 올바른 double-checked locking, VarHandle을 통한 저수준 접근, false sharing의 영향과 @Contended 애너테이션, 그리고 Thread.start()/ Thread.join(), Future.get(), 마이크로벤치마크 JMH에 대한 실무 팁도 함께 다룹니다.
    사용 가능
  • 멀티스레드 파일 읽기와 쓰기

    JAVA 25 SELF
    레벨 59,레슨 0
    Java에서 파일을 병렬로 다루는 실용 가이드: 언제 멀티스레딩이 I/O를 정말로 가속하고 언제 그렇지 않은지, 도구 선택 — Thread, ExecutorService로 구성하는 스레드 풀, CompletableFuture 기반 비동기 처리와 병렬 스트림 — 그리고 FileChannel로 큰 파일을 청크 단위로 읽기, 공용 로그에 안전하게 쓰기, OS/파일 시스템의 제약. 작업 실행 패턴, 풀 설정, shutdown()/ awaitTermination() 메서드와 흔한 실수를 다룹니다.
    사용 가능
  • 파일 병렬 처리: ForkJoin, 병렬 스트림

    JAVA 25 SELF
    레벨 59,레슨 1
    Java에서 파일 작업을 병렬화하는 실전 가이드: Stream API에서 parallel()/ parallelStream()으로 병렬 처리를 켜는 방법, ForkJoinPool의 동작과 설정, 그리고 언제 RecursiveTask를 쓰는 것이 좋은지. 어디에서 병렬 처리가 I/O를 실제로 가속하는지, 공용 스레드 풀을 어떻게 관리하는지, 그리고 ( try-with-resources)로 자원을 안전하게 닫는 방법을 다룹니다. 마지막에는 큰 파일의 일부를 읽기/쓰기를 위한 FileChannel의 위치 기반 접근을 빠르게 살펴봅니다.
    사용 가능
  • 파일 시스템 병렬 순회: Files.walk + parallel() 및 ForkJoin

    JAVA 25 SELF
    레벨 59,레슨 2
    거대한 디렉터리를 순회하고 수천 개 파일을 처리하는 속도를 높이는 방법: Files.walk()와 parallel()을 통한 병렬 스트림을 사용하고, ForkJoinPool.commonPool()의 역할을 이해하며 병렬도를 설정합니다. 언제 ExecutorService로 전환하는 것이 더 좋은지, CPU-bound와 IO-bound 작업의 차이는 무엇인지 알아보고, 모든 ".java" 파일의 줄 수를 세는 예제를 작성하며 best practices를 정리합니다.
    사용 가능
  • 대용량 파일을 청크로 분할하기

    JAVA 25 SELF
    레벨 59,레슨 3
    기가바이트급 파일 처리를 더 빠르게 하는 방법: 파일을 청크로 나누는 chunking, FileChannel을 통한 위치 기반 접근, memory-mapped 버퍼 MappedByteBuffer 사용, ExecutorService로 계산을 병렬화합니다. 위치 기반 I/O의 핵심 메서드 position(...), read(...), write(...)를 살펴보고, 청크 크기 선택 기준, 병렬 단어 카운트 예제, 그리고 흔한 실수(청크 경계, 리소스, 스레드 수)를 정리합니다.
    사용 가능
  • 파일 처리 파이프라인: producer–consumer

    JAVA 25 SELF
    레벨 59,레슨 4
    Producer–Consumer 패턴으로 BlockingQueue(예: ArrayBlockingQueue)를 통해 안전하게 데이터를 교환하는 방법, 블로킹 연산 put()과 take()가 어떻게 동작하는지, backpressure가 왜 필요한지, 그리고 “poison pill”(예: "__END__", null 아님)로 스레드를 올바르게 종료하는 방법을 살펴봅니다. 또한 ExecutorService로 소비자 스레드를 실행하고, 파이프라인을 시각화하며, 흔히 발생하는 실수를 정리합니다.
    사용 가능
  • 모듈 소개: 왜 필요한가

    JAVA 25 SELF
    레벨 60,레슨 0
    Java 9가 모듈 시스템 JPMS를 도입한 이유를 살펴봅니다: “ classpath-party”가 왜 문제인지, 모듈이 컨테이너 수준에서 가시성 경계를 어떻게 도입하는지, module-info.java가 무엇이며 module, exports, requires, opens, uses/ provides 지시어를 어떻게 다루는지. 장점(캡슐화, 명시적 의존성, 보안, jlink), 적용 분야( java.base, java.sql 포함), 유용한 뉘앙스와 마이그레이션 시 흔한 실수(빠진 exports, 누락된 requires, 모듈 이름 중복)도 함께 논의합니다.
    사용 가능
  • 1
  • ...
  • 25
  • 26
  • 27
  • 28
  • 29
  • 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