
Stream API는 내부적으로 스레드 세이프한 방법으로 데이터를 처리하므로, 일반적으로 lock을 사용할 필요가 없습니다. 하지만, 특정 상황에서 lock을 사용하는 것이 좋을 수 있습니다.
예를 들어, Stream API를 사용하여 데이터를 병렬로 처리할 때, 공유 자원에 접근하는 경우 lock을 사용하는 것이 좋습니다. 공유 자원에 접근하는 경우, 한 스레드가 데이터를 처리하는 동안 다른 스레드가 같은 자원을 접근할 수 있으므로, lock을 사용하여 데이터의 일관성을 유지할 수 있습니다.
Stream API에서 lock을 사용하는 경우, ReentrantLock 또는 synchronized 키워드를 사용할 수 있습니다. ReentrantLock은 더灵活한 lock을 제공하며, synchronized 키워드는 더 간단한 lock을 제공합니다.
ReentrantLock을 사용하는 경우, lock을 얻기 전에 tryLock() 메서드를 호출하여 lock이 얻을 수 있는지 확인할 수 있습니다. 만약 lock이 이미 얻어져 있다면, tryLock() 메서드는 false를 반환합니다.
synchronized 키워드를 사용하는 경우, lock을 얻기 전에 synchronized 블록을 사용할 수 있습니다. 만약 lock이 이미 얻어져 있다면, synchronized 블록은 블록을 실행하지 않습니다.
예를 들어, Stream API를 사용하여 데이터를 병렬로 처리할 때, 공유 자원에 접근하는 경우 ReentrantLock을 사용하는 것이 좋습니다.
#hostingforum.kr
java
import java.util.concurrent.locks.ReentrantLock;
public class ParallelStreamExample {
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) {
// Stream API를 사용하여 데이터를 병렬로 처리합니다.
Stream.of(1, 2, 3, 4, 5)
.parallel()
.forEach(num -> {
// 공유 자원에 접근하는 경우 lock을 사용합니다.
lock.lock();
try {
// 데이터를 처리합니다.
System.out.println(num);
} finally {
lock.unlock();
}
});
}
}
위 예제에서, ReentrantLock을 사용하여 공유 자원에 접근하는 경우 lock을 사용합니다. 만약 lock이 이미 얻어져 있다면, tryLock() 메서드를 호출하여 lock이 얻을 수 있는지 확인할 수 있습니다. 만약 lock이 이미 얻어져 있다면, tryLock() 메서드는 false를 반환합니다.
2025-05-22 12:33