ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 성능 최적화 기법 (동기화 반대)
    자바 및 spring boot 2024. 6. 2. 16:08

    `synchronized` 키워드는 자바에서 스레드 동기화를 통해 안전한 공유 리소스 접근을 보장하는데 사용됩니다. 그 반대로, 스레드 간의 동기화를 피하고 성능을 최적화하기 위해 몇 가지 기법이 존재합니다. 동기화의 반대 개념을 구현하는 방법들을 살펴보겠습니다:

    ### 1. **비동기 프로그래밍**
    비동기 프로그래밍은 특정 작업이 완료되기를 기다리지 않고 즉시 다음 작업을 수행할 수 있도록 합니다. 이는 동기화 오버헤드를 피하는 방법 중 하나입니다.

    ### 2. **스레드 로컬 변수 (ThreadLocal)**
    각 스레드마다 별도의 인스턴스를 제공하여, 공유 리소스를 피하고 데이터 일관성을 보장할 수 있습니다.

    ```java
    public class ThreadLocalExample {
        private static final ThreadLocal<Integer> threadLocalValue = ThreadLocal.withInitial(() -> 0);

        public void increment() {
            threadLocalValue.set(threadLocalValue.get() + 1);
        }

        public int getValue() {
            return threadLocalValue.get();
        }
    }
    ```

    ### 3. **불변 객체 (Immutable Objects)**
    불변 객체는 생성된 이후 상태가 변하지 않는 객체입니다. 여러 스레드에서 안전하게 공유할 수 있습니다.

    ```java
    public final class ImmutableExample {
        private final int value;

        public ImmutableExample(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }
    ```

    ### 4. **병렬 스트림 (Parallel Streams)**
    Java 8의 스트림 API를 사용하여 병렬 처리할 수 있습니다. 내부적으로 스레드 풀을 사용하여 병렬로 작업을 수행합니다.

    ```java
    import java.util.Arrays;
    import java.util.List;

    public class ParallelStreamExample {
        public static void main(String[] args) {
            List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
            int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
            System.out.println("Sum: " + sum);
        }
    }
    ```

    ### 5. **원자 클래스 (Atomic Classes)**
    Java의 `java.util.concurrent.atomic` 패키지에는 스레드에 안전한 원자 클래스들이 포함되어 있습니다. 이는 동기화 없이도 스레드 안전한 연산을 가능하게 합니다.

    ```java
    import java.util.concurrent.atomic.AtomicInteger;

    public class AtomicExample {
        private final AtomicInteger count = new AtomicInteger(0);

        public void increment() {
            count.incrementAndGet();
        }

        public int getCount() {
            return count.get();
        }
    }
    ```

    ### 6. **잠금 없는 자료구조 (Lock-Free Data Structures)**
    ConcurrentHashMap 같은 잠금 없는 자료구조를 사용하면 높은 성능과 스레드 안전성을 보장할 수 있습니다.

    ```java
    import java.util.concurrent.ConcurrentHashMap;

    public class ConcurrentHashMapExample {
        private final ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();

        public void putValue(String key, Integer value) {
            map.put(key, value);
        }

        public Integer getValue(String key) {
            return map.get(key);
        }
    }
    ```

    ### 결론
    위의 방법들은 동기화가 필요 없는 상황에서 성능을 최적화하고, 데이터 일관성을 보장하는 데 유용합니다. 각 기법은 특정 상황에 맞게 사용되어야 하며, 동기화와의 타협점에서 적절히 선택하는 것이 중요합니다.

    '자바 및 spring boot' 카테고리의 다른 글

    대용량 트래픽 처리  (0) 2024.06.18
    비동기 쓰레드 풀 지정 및 CompletableFuture 개념  (0) 2024.06.13
    Asynchronous 비동기  (0) 2024.06.02
    synchronized 동기화  (0) 2024.06.02
    레디스 캐시 쏠림, 쓰레싱  (0) 2024.06.02
Designed by Tistory.