반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

[java] 동시성 Concurrency 본문

카테고리 없음

[java] 동시성 Concurrency

닉의네임 2025. 5. 14. 06:56
반응형

**동시성(Concurrency)**은 여러 작업이나 프로세스가 동시에 진행될 수 있도록 하는 시스템의 능력입니다. 동시성은 주로 멀티스레딩(Multithreading) 또는 **병렬 처리(Parallel Processing)**와 관련이 있습니다. 그러나 이 둘은 개념적으로 다르며, 동시성은 실제로 "동시에" 실행되는 것과 "순차적으로 실행되는 것처럼 보이게 하는 것"에 초점을 맞추고 있습니다.

동시성과 병렬성의 차이

  • 동시성 (Concurrency): 여러 작업이 겹쳐서 실행되는 방식입니다. 즉, 한 프로세서에서 여러 작업이 시분할 방식으로 번갈아 가며 실행되는 것을 의미합니다. 다수의 스레드가 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 시간을 나누어 작업을 처리합니다. 멀티코어 시스템에서는 진짜 병렬 처리가 이루어질 수도 있습니다.
  • 병렬성 (Parallelism): 실제로 여러 작업이 동시에 실행되는 것입니다. 즉, 여러 CPU 코어가 각기 다른 작업을 독립적으로 처리하는 방식입니다. 이는 멀티스레딩 또는 멀티프로세싱을 통해 성능을 향상시킬 수 있습니다.

동시성의 특징

  1. 시스템 자원 공유: 여러 프로세스나 스레드가 동일한 자원(CPU, 메모리 등)을 공유하면서 동시에 작업을 처리하려 합니다.
  2. 멀티스레딩/멀티프로세싱: 동시성은 여러 스레드나 프로세스가 동시에 실행되는 것처럼 보이게 하여, 응답성을 높이거나 성능을 최적화할 수 있습니다.
  3. 비동기 실행: 동시성은 작업을 병렬적으로 실행하지 않더라도, 작업을 순차적으로 실행하는 것처럼 보이지 않게 하고, 다른 작업을 기다리는 동안 다른 작업을 할 수 있도록 합니다.

자바에서의 동시성 구현 방법

  1. 멀티스레딩 (Multithreading):
    • 자바에서 동시성 프로그래밍을 구현하는 주요 방법은 **스레드(Thread)**를 사용하는 것입니다. 자바에서는 Thread 클래스를 확장하거나 Runnable 인터페이스를 구현하여 여러 스레드를 생성하고 실행할 수 있습니다.
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start(); // 새로운 스레드 실행
    }
}

 

  1. Executor Service:
    • ExecutorService는 스레드를 효율적으로 관리하고 실행하기 위한 자바의 고수준 API입니다. 이를 통해 스레드를 직접 제어하는 대신, 작업을 제출하고 관리할 수 있습니다.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        executorService.submit(() -> {
            System.out.println("Task 1");
        });
        executorService.submit(() -> {
            System.out.println("Task 2");
        });
        executorService.submit(() -> {
            System.out.println("Task 3");
        });
        executorService.shutdown();  // ExecutorService 종료
    }
}

 

  1. 동기화 (Synchronization):
    • 여러 스레드가 동일한 자원에 접근할 때, 자원에 대한 충돌을 방지하기 위해 동기화가 필요합니다. 자바에서는 synchronized 키워드를 사용하여 임계 구역을 보호하고, 여러 스레드가 동시에 하나의 자원에 접근하지 않도록 할 수 있습니다.
     
class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();

        // 여러 스레드가 동시에 카운트를 증가시키는 코드
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) counter.increment();
        });

        t1.start();
        t2.start();
    }
}

동시성 문제

동시성 프로그래밍에서 주의해야 할 몇 가지 주요 문제들이 있습니다:

  1. 경쟁 상태 (Race Condition): 여러 스레드가 동시에 같은 자원에 접근하고 수정할 때 발생할 수 있습니다. 이는 자원의 일관성을 깨뜨리고 예기치 않은 결과를 초래할 수 있습니다.
  2. 데드락 (Deadlock): 두 개 이상의 스레드가 서로 다른 자원을 기다리며 무한히 멈추는 상태입니다. 이를 피하기 위해 자원 잠금 순서를 잘 관리해야 합니다.
  3. 스타베이션 (Starvation): 우선순위가 낮은 스레드가 계속 실행되지 못하고 대기 상태에 빠지는 문제입니다.
  4. 라이브락 (Livelock): 스레드가 계속해서 상태를 변경하면서 실행되지만, 실제로는 아무 작업도 수행하지 않는 상태입니다.

동시성의 장점

  • 성능 향상: 여러 작업을 동시에 처리하여 시스템의 성능을 향상시킬 수 있습니다. 특히 멀티코어 CPU 환경에서는 효율적인 작업 분배가 가능합니다.
  • 응답성 향상: 동시에 여러 작업을 처리할 수 있어, UI 응용 프로그램에서는 사용자와의 상호작용을 중단하지 않고도 백그라운드 작업을 처리할 수 있습니다.
  • 리소스 최적화: CPU가 유휴 상태로 남지 않고 효율적으로 자원을 사용할 수 있습니다.

결론

동시성은 시스템에서 여러 작업을 동시에 처리하는 능력을 제공하여, 멀티스레딩, 병렬 처리, 비동기 실행 등 다양한 방식으로 성능과 응답성을 향상시킬 수 있습니다. 자바에서 동시성을 효과적으로 관리하기 위해서는 스레드 관리, 동기화, 적절한 동시성 패턴을 이해하고 구현하는 것이 중요합니다.

반응형
Comments