
멀티 스레드를 이용하여 프로그래밍을 하다보면, CPU Cache Memory와 Main Memory간의 일치하지 않는 데이터로 인해 문제가 발생하기도 합니다. 이때 이를 방지하기 위해 volatile 키워드를 사용할 수 있습니다.이번에는 volatile과 메모리 가시성을 이해하고자, 간단한 예제를 통해 알아보겠습니다.메모리 가시성public class VolatileFlagMain { public static void main(String[] args) { MyTask task = new MyTask(); Thread t = new Thread(task, "work"); log("runFlag = " + task.runFlag); t.start();..

저번 포스팅에 이어 자바의 Future에 대해 알아보겠습니다.Future - 취소이번에는 아래 코드를 통해 cancel()이 어떻게 동작하는지 알아보겠습니다.public class FutureCancelMain { private static boolean mayInterruptIfRunning = true; // 변경 // private static boolean mayInterruptIfRunning = false; // 변경 public static void main(String[] args) { ExecutorService es = Executors.newFixedThreadPool(1); Future future = es.submit(new MyTask()..

저번 포스팅에 이어 자바의 Future에 대해 알아보겠습니다.이번에는 1~100까지 더하는 경우를 스레드를 사용해서 1부터 50, 51부터 100으로 나누어 처리하는 예제를 작성하였습니다.스레드1: 1~50까지 더함 스레드2: 51~100까지 더함SumTask - Runnable먼저 ExecutorService없이 Runnable과 순수 스레드로 수행해보겠습니다.public class SumTaskMainV1 { public static void main(String[] args) throws InterruptedException { SumTask task1 = new SumTask(1, 50); SumTask task2 = new SumTask(51, 100); ..

이번에는 Executor 프레임워크 포스팅에 이어 자바의 Future에 대해 알아보겠습니다.Runnable과 Callable 비교Runnable은 다음과 같습니다.package java.lang;public interface Runnable { void run();}Runnable의 run()은 반환 타입이 void이다. 따라서 값을 반환할 수 없다.예외가 선언되어 있지 않다. 따라서 해당 인터페이스를 구현하는 모든 메서드는 체크 예외를 던질 수 없다. 참고로 자식은 부모의 예외 범위를 넘어설 수 없다. 부모에 예외가 선언되어 있지 않으므로 예외를 던질 수 없다.물론 런타임(비체크)예외는 제외다.Callable은 다음과 같습니다.package java.util.concurrent;public int..

Executor 프레임워크에 대해 알아보기 전에 "쓰레드를 직접 사용할 때의 문제점"에 대한 내용은 여기에서 살펴보실 수 있습니다. 자바의 Executor 프레임워크는 멀티스레딩 및 병렬 처리를 쉽게 사용할 수 있도록 돕는 기능의 모음입니다. 이 프레임워크는 작업 실행의 관리 및 스레드 풀 관리를 효율적으로 처리해서 개발자가 직접 스레드를 생성하고 관리하는 복잡함을 줄여줍니다. Executor 프레임워크의 주요 구성 요소Executor 인터페이스package java.util.concurrent;public interface Executor { void execute(Runnable command);}가장 단순한 작업 실행 인터페이스로, execute(Runnable command) 메서드 하나를 ..

실무에서 스레드를 직접 생성해서 사용하면 다음과 같은 3가지 문제가 있습니다.스레드 생성 시간으로 인한 성능 문제스레드 관리 문제Runnable 인터페이스의 불편함1. 스레드 생성 비용으로 인한 성능 문제스레드를 사용하려면 먼저 스레드를 생성해야 합니다. 그런데 스레드는 다음과 같은 이유로 매우 무겁습니다.메모리 할당: 각 스레드는 자신만의 호출 스택(call stack)을 가지고 있어야 한다. 이 호출 스택은 스레드가 실행되는 동안 사용하는 메모리 공간이다. 따라서 스레드를 생성할 때는 이 호출 스택을 위한 메모리를 할당해야 한다. 운영체제 자원 사용: 스레드를 생성하는 작업은 운영체제 커널 수준에서 이루어지며, 시스템 콜(system call)을 통해 처리된다. 이는 CPU와 메모리 리소스를 소모하는..

동시성 컬렉션이 필요한 이유에 대해서는 여기에서 확인하실 수 있습니다.자바가 제공하는 java.util 패키지에 있는 컬렉션 프레임워크들은 대부분 스레드 안전(Thread Safe)하지 않습니다.우리가 일반적으로 사용하는 ArrayList, LinkedList, HashSet, HashMap 등 수 많은 기본 자료 구조들은 내 부에서 수 많은 연산들이 함께 사용됩니다. 배열에 데이터를 추가하고 사이즈를 변경하고, 배열을 새로 만들어서 배열의 크기도 늘리고, 노드를 만들어서 링크에 연결하는 등 수 많은 복잡한 연산이 함께 사용됩니다.그렇다면 처음부터 모든 자료 구조에 synchronized를 사용해서 동기화를 해두면 어떨까요?synchronized, Lock, CAS 등 모든 방식은 정도의 차이는 있지만 ..

java.util 패키지에 소속되어 있는 컬렉션 프레임워크는 원자적인 연산을 제공할까요? 예를 들어서 하나의 ArrayList 인스턴스에 여러 스레드가 동시에 접근해도 괜찮을까요?여러 스레드가 동시에 접근해도 괜찮은 경우를 스레드 세이프(Thread Safe)하다고 표현합니다. 그렇다면 ArrayList 는 스레드 세이프 할까요?아래 예제 코드를 보며 알아보겠습니다.import java.util.ArrayList;import java.util.List;public class SimpleListMainV0 { public static void main(String[] args) { List list = new ArrayList(); // 스레드1, 스레드2가 동시에 실행 가정..

동시성 제어를 위한 CAS에 대한 세부 내용은 여기에서 확인하실 수 있습니다.CAS는 단순한 연산 뿐만 아니라, 락을 구현하는데 사용할 수도 있습니다. 이번에는 synchronized, Lock(ReentrantLock)없이 CAS를 활용해서 락을 구현 해보겠습니다.이에 앞서 CAS의 필요성을 이해하기 위해 CAS없이 직접 락을 구현해보겠습니다.단순한 스핀 락 방식CAS없이 스핀 락을 구현해보겠습니다.public class SpinLockBad { private volatile boolean lock = false; public void lock() { log("락 획득 시도"); while (true) { if (!lock) { ..

컴퓨터 과학에서 사용하는 원자적 연산(atomic operation)의 의미는 해당 연산이 더 이상 나눌 수 없는 단위로 수행된 다는 것을 의미합니다. 즉, 원자적 연산은 중단되지 않고, 다른 연산과 간섭 없이 완전히 실행되거나 전혀 실행되지 않는 성질을 가지고 있습니다. 쉽게 이야기해서 멀티스레드 상황에서 다른 스레드의 간섭 없이 안전하게 처리되는 연산이라는 뜻입니다.예를 들어서 다음과 같은 필드가 있을 때int i = 0;다음 연산은 둘로 쪼갤 수 없는 원자적 연산입니다. i = 1;왜냐하면 이 연산은 다음 단 하나의 순서로 실행되기 때문입니다.(오른쪽에 있는 1 의 값은 왼쪽의 i 변수에 대입한다.)하지만 다음 연산은 원자적 연산이 아닙니다.i = i + 1;왜냐하면 이 연산은 다음 순서로 나누어 ..
- Total
- Today
- Yesterday
- Java
- 김영한
- 코테
- 코틀린
- 스프링
- 데이터베이스
- 정렬
- 자바
- MySQL
- mysql 8.0
- 구현
- Spring
- leetcode
- 파이썬
- 스프링 부트
- 인프런
- kotlin
- 알고리즘
- 스프링부트
- 그리디
- 북클럽
- 릿코드
- spring boot
- 자료구조
- webflux
- 문자열
- Algorithm
- Real MySQL
- 노마드코더
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |