[Java] 동시성 문제와 해결책
동기화(Synchronization)
synchronized 키워드를 사용하여 특정 메소드나 블록에 한 번에 하나의 스레드만 접근하도록 제한한다.
public class SynchronizedCounter {
private int count = 0;
// Synchronized Method
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public synchronized int value() {
return count;
}
}
병렬 스트림(Parallel Streams)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
System.out.println(sum); // Output: 55
락(Locks)
java.util.concurrent.locks 패키지에 포함된 락들을 사용하면 더 세밀한 제어가 가능하다.
import java.util.concurrent.locks.ReentrantLock;
public class LockCounter {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public void decrement() {
lock.lock();
try {
count--;
} finally {
lock.unlock();
}
}
public int value() {
return count;
}
}
원자적 클래스(Atomic Classes)
java.util.concurrent.atomic 패키지에 있는 클래스들은 원자적 연산을 지원한다.
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public void decrement() {
count.decrementAndGet();
}
public int value() {
return count.get();
}
}
스레드 세이프 컬렉션(Thread-Safe Collections)
java.util.concurrent 패키지에는 스레드 세이프한 컬렉션들이 있다.
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");
String value = map.get("key"); // Output: "value"
}
}
CompletableFuture
Java 8부터 추가된 CompletableFuture는 비동기 연산을 표현하는 클래스이다.
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
String result = future.get(); // Output: "Hello"
}
}
댓글남기기