
๐ก ์ด ๊ธ์ ํ์ฌ ์ธํด ๊ธฐ๊ฐ์ ์คํฐ๋ํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค!
Thread Safety๋?
์ ๊ธ์ ์ด์ด์ ์์ฑ๋ ๊ฒ์๊ธ์
๋๋ค.
์ ๊ธ์์ ์์๋ณธ Thread Safe๋ฅผ ์งํค๊ธฐ ์ํด์ ์๋์ ๊ฐ์ ํด๊ฒฐ๋ฐฉ์์ด ์๋ค.
์ด ๊ธ์์๋ ThreadLocal์ ๋ํด์ ์์๋ณด์.


ThreadLocal์ ์ค๋ ๋ ๋ณ๋ก ์์ฑ๋๋ ๋ณ์์ด๋ค.
์ ์ธ๋ ํํ๋ง ๋ณด๋ฉด ๋ค๋ฅธ ๋ณ์์ฒ๋ผ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์ ๊ทผํ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๊ฐ ์ค๋ ๋ ๋ณ๋ก ํ ๋น๋๋ค.
ThreadLocal์ ์ฌ์ฉํ๋ฉด ์๋ก ๊ณต์ ํ ํ์๊ฐ ์ ํ ์๋ ์ ๋ณด๋ฅผ ๊ฐ ์ค๋ ๋ ๋ณ๋ก ์ ์ฅํด์ ์์ ํ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค.

ThreadLocal์ ํด๋น ์์์ ์ ๊ทผํ์ฌ CRUD ํ ์ ์๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋น๊ตํด์ ๋ณด๊ธฐ ์ํด ์ฐ์ ThreadLocal์ ์ฌ์ฉํ์ง ์์ ์์ ๋ถํฐ ๋ณด์.
public class SharedVariableExample {
private static int sharedValue = 0;
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
sharedValue++;
System.out.println(Thread.currentThread().getName() + ": " + sharedValue);
}
};
Thread thread1 = new Thread(task, "Thread-1");
Thread thread2 = new Thread(task, "Thread-2");
thread1.start();
thread2.start();
}
}
Thread-2: 2
Thread-2: 3
Thread-2: 4
Thread-2: 5
Thread-1: 1
Thread-1: 7
Thread-1: 8
Thread-1: 9
Thread-1: 10
Thread-2: 6
์์ ์ฝ๋์ ์ถ๋ ฅ์ ์์ ๊ฐ๋ค.
๋ ์ค๋ ๋์๊ฒ ๊ฐ๊ฐ sharedValue์ 5๋ฒ์ฉ ํ์ ์ฆ๊ฐ์ ํ๋ ์ฐ์ฐ์ ์์ผฐ๋ค.
sharedValue๋ ์ด 10๋ฒ์ ํ์ ์ฆ๊ฐ์ ์ํํ๊ณ , ๋ ์ค๋ ๋๊ฐ ์์ ํ๋ ์์ ๋ํ ๋ณด์ฅ๋์ง ์์๋ค.
ํ๋ก๊ทธ๋จ ํน์ง์ ๋ฐ๋ผ์๋ ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ๋ง๋ฉ์์ ์ ์๋ค.
๊ฐ์ ์์ ์ ThreadLocal์ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
public class ThreadLocalExample {
private static final ThreadLocal<Integer> threadLocal = ThreadLocal.withInitial(() -> 0);
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
int value = threadLocal.get();
threadLocal.set(value + 1);
System.out.println(Thread.currentThread().getName() + ": " + threadLocal.get());
}
threadLocal.remove();
};
Thread thread1 = new Thread(task, "Thread-1");
Thread thread2 = new Thread(task, "Thread-2");
thread1.start();
thread2.start();
}
}
Thread-2: 1
Thread-1: 1
Thread-2: 2
Thread-1: 2
Thread-2: 3
Thread-1: 3
Thread-2: 4
Thread-1: 4
Thread-1: 5
Thread-2: 5
ThreadLocal ๋ณ์๋ฅผ ํ์ฉํด์ ๋์ผํ๊ฒ 1์ฉ ์ฆ๊ฐํ๋ ์ฐ์ฐ์ ์ด 5๋ฒ ์ํํ๋๋ก ๋ ์ค๋ ๋์๊ฒ ๊ฐ๊ฐ ์์ผฐ๋ค.
ThreadLocal ๋ณ์๋ ์ค๋ ๋ ๋ณ๋ก ๊ฐ๊ฐ ์กด์ฌํ๊ฒ ๋ผ์ ์์
์ํ ๊ฒฐ๊ณผ 5๋ผ๋ ๊ฐ์ ๊ฐ๊ฐ ๊ฐ์ง๊ฒ ๋๋ค.
๋ค๋ฅธ ์ค๋ ๋์ ThreadLocal ๋ณ์๋ฅผ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋ ๋ณ๋ก ์์ ํ ๋ ๋ฆฝ๋ ์ ๋ณด์ ๋ํด์ ThreadLocal ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ข๋ค.
๋ํ์ ์ธ ์๋ก ์ ์ ์ ๋ํ ์ ๋ณด๊ฐ ๋ ์ ์๋ค.
๊ฐ ์ค๋ ๋๊ฐ ํ ๋ช
์ ์ ์ ์ ๋ํด ์์
ํ ๋, ๋ด๊ฐ ๋ด๋นํ์ง ์์ ๋ค๋ฅธ ์ ์ ์ ๋ํ ์ ๋ณด๋ ์ ํ์๋ ์๊ณ ์์์๋ ์ ๋๋ค.