쓰레드로컬 - 동시성 문제

박찬우·2024년 2월 9일
0

스프링

목록 보기
29/88
post-thumbnail

동시성 문제

  • 싱글톤에서 필드를 공유하면 발생하는 문제
  • 같은 필드를 공유하고 있기 때문에 동시에 접근하는 경우 원하는 값이 나오지 않을 수 있음

예)

  • 이름을 저장하고 1초 뒤에 저장한 이름을 조회하는 테스트

  • 테스트에서 이름(A)을 저장하자마자 0.1초만에 또다른 쓰레드를 호출하여 다른 이름(B) 저장
  • 처음 쓰레드는 결국 B 이름을 반환하게 됨
@Slf4j
public class FieldService {
    private String nameStore;

    public String logic(String name) {
        log.info("저장 name={} -> nameStore={}", name, nameStore);
        nameStore = name;
        sleep(1000);
        log.info("조회 nameStore={}", nameStore);
        return nameStore;
    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
@Slf4j
public class FieldServiceTest {
    private FieldService fieldService = new FieldService();

    @Test
    void field() {
        log.info("main start");

        Runnable userA = () -> {
            fieldService.logic("userA");
        };

        Runnable userB = () -> {
            fieldService.logic("userB");
        };

        Thread threadA = new Thread(userA);
        threadA.setName("thread-A");
        Thread threadB = new Thread(userB);
        threadB.setName("thread-B");

        threadA.start();
        sleep(100);
        threadB.start();

        sleep(3000);
        log.info("main exit");
    }

    private void sleep(int millis) {
        try {
            Thread.sleep(millis);
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
    }
}

profile
진짜 개발자가 되어보자

0개의 댓글