일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Python
- aggregation
- 파이썬
- Elasticsearch
- zip 암호화
- Java
- springboot
- License
- aggs
- TensorFlow
- license delete
- sort
- 900gle
- API
- Test
- flask
- token filter test
- Mac
- ELASTIC
- MySQL
- query
- Kafka
- plugin
- analyzer test
- 차트
- zip 파일 암호화
- docker
- licence delete curl
- high level client
- matplotlib
Archives
- Today
- Total
개발잡부
[java] 동시성 Concurrency 본문
반응형
**동시성(Concurrency)**은 여러 작업이나 프로세스가 동시에 진행될 수 있도록 하는 시스템의 능력입니다. 동시성은 주로 멀티스레딩(Multithreading) 또는 **병렬 처리(Parallel Processing)**와 관련이 있습니다. 그러나 이 둘은 개념적으로 다르며, 동시성은 실제로 "동시에" 실행되는 것과 "순차적으로 실행되는 것처럼 보이게 하는 것"에 초점을 맞추고 있습니다.
동시성과 병렬성의 차이
- 동시성 (Concurrency): 여러 작업이 겹쳐서 실행되는 방식입니다. 즉, 한 프로세서에서 여러 작업이 시분할 방식으로 번갈아 가며 실행되는 것을 의미합니다. 다수의 스레드가 동시에 실행되는 것처럼 보이지만, 실제로는 CPU가 시간을 나누어 작업을 처리합니다. 멀티코어 시스템에서는 진짜 병렬 처리가 이루어질 수도 있습니다.
- 병렬성 (Parallelism): 실제로 여러 작업이 동시에 실행되는 것입니다. 즉, 여러 CPU 코어가 각기 다른 작업을 독립적으로 처리하는 방식입니다. 이는 멀티스레딩 또는 멀티프로세싱을 통해 성능을 향상시킬 수 있습니다.
동시성의 특징
- 시스템 자원 공유: 여러 프로세스나 스레드가 동일한 자원(CPU, 메모리 등)을 공유하면서 동시에 작업을 처리하려 합니다.
- 멀티스레딩/멀티프로세싱: 동시성은 여러 스레드나 프로세스가 동시에 실행되는 것처럼 보이게 하여, 응답성을 높이거나 성능을 최적화할 수 있습니다.
- 비동기 실행: 동시성은 작업을 병렬적으로 실행하지 않더라도, 작업을 순차적으로 실행하는 것처럼 보이지 않게 하고, 다른 작업을 기다리는 동안 다른 작업을 할 수 있도록 합니다.
자바에서의 동시성 구현 방법
- 멀티스레딩 (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(); // 새로운 스레드 실행
}
}
- Executor Service:
- ExecutorService는 스레드를 효율적으로 관리하고 실행하기 위한 자바의 고수준 API입니다. 이를 통해 스레드를 직접 제어하는 대신, 작업을 제출하고 관리할 수 있습니다.
- 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 종료
}
}
- 동기화 (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();
}
}
동시성 문제
동시성 프로그래밍에서 주의해야 할 몇 가지 주요 문제들이 있습니다:
- 경쟁 상태 (Race Condition): 여러 스레드가 동시에 같은 자원에 접근하고 수정할 때 발생할 수 있습니다. 이는 자원의 일관성을 깨뜨리고 예기치 않은 결과를 초래할 수 있습니다.
- 데드락 (Deadlock): 두 개 이상의 스레드가 서로 다른 자원을 기다리며 무한히 멈추는 상태입니다. 이를 피하기 위해 자원 잠금 순서를 잘 관리해야 합니다.
- 스타베이션 (Starvation): 우선순위가 낮은 스레드가 계속 실행되지 못하고 대기 상태에 빠지는 문제입니다.
- 라이브락 (Livelock): 스레드가 계속해서 상태를 변경하면서 실행되지만, 실제로는 아무 작업도 수행하지 않는 상태입니다.
동시성의 장점
- 성능 향상: 여러 작업을 동시에 처리하여 시스템의 성능을 향상시킬 수 있습니다. 특히 멀티코어 CPU 환경에서는 효율적인 작업 분배가 가능합니다.
- 응답성 향상: 동시에 여러 작업을 처리할 수 있어, UI 응용 프로그램에서는 사용자와의 상호작용을 중단하지 않고도 백그라운드 작업을 처리할 수 있습니다.
- 리소스 최적화: CPU가 유휴 상태로 남지 않고 효율적으로 자원을 사용할 수 있습니다.
결론
동시성은 시스템에서 여러 작업을 동시에 처리하는 능력을 제공하여, 멀티스레딩, 병렬 처리, 비동기 실행 등 다양한 방식으로 성능과 응답성을 향상시킬 수 있습니다. 자바에서 동시성을 효과적으로 관리하기 위해서는 스레드 관리, 동기화, 적절한 동시성 패턴을 이해하고 구현하는 것이 중요합니다.
반응형
Comments