Thread Local
Java Thread Local์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ฐ ์ค๋ ๋์์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ๋๋ ๊ฐ์ฒด์ ๋ํ ๋์ ์ ๊ทผ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
Thread Local์ ์ฌ์ฉํ๋ ค๋ฉด java.lang ํจํค์ง์ ThreadLocal ํด๋์ค๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค. ๊ฐ ์ค๋ ๋์์ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๋๋ก ํ๋ ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค์, ThreadLocal ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํด๋น ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
public class MyThreadSafeClass {
private ThreadLocal<Integer> threadLocalValue = new ThreadLocal<Integer>() {
@Override
protected Integer initialValue() {
return 0;
}
};
public void incrementValue() {
threadLocalValue.set(threadLocalValue.get() + 1);
}
public int getValue() {
return threadLocalValue.get();
}
}
์์ ์ฝ๋์์๋ MyThreadSafeClass ํด๋์ค ๋ด๋ถ์์ ThreadLocal ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ Integer ๊ฐ์ ์ ์ฅํฉ๋๋ค. initialValue() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ, ์ค๋ ๋๊ฐ ๊ฐ์ ์ฒ์์ผ๋ก ์ ๊ทผํ ๋ 0์ ๋ฐํํ๋๋ก ์ค์ ํฉ๋๋ค.
incrementValue() ๋ฉ์๋๋ Thread Local์ ์ ์ฅ๋ ๊ฐ์ ์ฆ๊ฐ์ํค๊ณ , getValue() ๋ฉ์๋๋ Thread Local์ ์ ์ฅ๋ ๊ฐ์ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์ฌ๋ฌ ์ค๋ ๋์์ MyThreadSafeClass ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋๋ผ๋ ๊ฐ ์ค๋ ๋์์๋ ๊ณ ์ ํ ๊ฐ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
ํ์ฉ ์์
Thread Local์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ง์ด ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ ์์ฒญ๋ง๋ค ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์งํ๊ณ ์ถ์ ๋ Thread Local์ ํ์ฉํ ์ ์์ต๋๋ค.
public class UserContext {
private static final ThreadLocal<User> userThreadLocal = new ThreadLocal<>();
public static void setUser(User user) {
userThreadLocal.set(user);
}
public static User getUser() {
return userThreadLocal.get();
}
}
์์ ์ฝ๋์์๋ UserContext ํด๋์ค ๋ด๋ถ์์ Thread Local์ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ ์์ฒญ๋ง๋ค UserContext.setUser() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ฉด, ํด๋น ์์ฒญ์์๋ UserContext.getUser() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
Java Thread Local์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ๋ณ์์ ๋ํ ๋์ ์ ๊ทผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ์์ ์ ์ฉ
Last updated