์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[์Šคํ”„๋ง] ๋™์‹œ์„ฑ ๋ฌธ์ œ, ThreadLocal

๐Ÿ˜Ž ์ง€์‹ in Action/Spring ๐ŸŒฑ

by :ํ•ดํ”ผ๋ž˜๋น—๐Ÿพ 2024. 11. 25. 12:24

๋ณธ๋ฌธ

์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋ก๋œ FieldLogTrace ๋นˆ์—์„œ ์ธ์Šคํ„ด์Šค์˜ ํ•„๋“œ, ๋˜๋Š” static ๊ฐ™์€ ๊ณต์šฉ ํ•„๋“œ์— ๋™์‹œ์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒ

 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์˜ˆ์‹œ

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");
    }
}

 

 

ThreadLocal

๊ฐ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋‚ด๋ถ€ ์ €์žฅ์†Œ ์ œ๊ณต

๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ ์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ ํ•„๋“œ์— ์ ‘๊ทผํ•ด๋„ ๋ฌธ์ œ ์—†์Œ

public class ThreadLocalService {
    private ThreadLocal<String> nameStore = new ThreadLocal<>();
    
    public String logic(String name){
        log.info("์ €์žฅ name={} -> nameStore={}", name, nameStore.get());
        nameStore.set(name);
        sleep(1000);
        log.info("์กฐํšŒ nameStore={}", nameStore.get());
        return nameStore.get();
    }

}

 

 

WAS์˜ ์“ฐ๋ ˆ๋“œ ํ’€์—์„œ thread-A๋Š” ์‚ด์•„์žˆ๋‹ค 

๋”ฐ๋ผ์„œ, ์‚ฌ์šฉ์ž A์š”์ฒญ์ด ๋๋‚  ๋•Œ ์“ฐ๋ ˆ๋“œ ๋กœ์ปฌ์˜ ๊ฐ’์„ ThreadLocal.remove()๋ฅผ ํ†ตํ•ด ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค

728x90

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ