๋์์ฑ(Concurrency)
โObjects are abstractions of processing. Threads are abstractions of schedule.โ โ James O. Coplien
Thread๋ฅผ ํ๋๋ง ์คํํ๋ ์ฝ๋๋ ์ง๊ธฐ๊ฐ ์ฝ๋ค. ๊ฒ์ผ๋ก ๋ณด๊ธฐ์๋ ๋ฉ์ฉกํ์ง๋ง ๊น์ํ ๊ณณ์ ๋ฌธ์ ๊ฐ ์๋ ๋ค์ค Thread ์ฝ๋๋ ์ง๊ธฐ ์ฝ๋ค. ์์คํ ์ด ์ปค์ง๊ณ ๋ถํ๊ฐ ์ปค์ง๋ฉด ๋ฌธ์ ๋ ๋ฐ์ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์งํค๋ ๊ท์น์ ๋ํด ์๊ฐํ๋ค.
์ Concurrency๊ฐ ํ์ํ๊ฐ?
Concurrency๋ ๋จ์ผ ์ค๋ ๋์์ ์ฎ์ฌ ์๋ โ๋ฌด์(What)์ ํ ๊ฒ์ธ๊ฐโ์ โ์ธ์ (When) ๋๋ ๊ฒ์ธ๊ฐโ๊ฐ์ Coupoing์ ํด์์์ผ ์ค๋ค. ์ด๋ ์ฒ๋ฆฌ๋๊ณผ ๊ตฌ์กฐ ๊ฐ์ ์ ๋์์ ์ค ์ ์๋ค. ๊ฑฐ๋ํ ํ๋์ Loop๊ฐ ์๋๋ผ ์์ ํ๋ ฅ ํ๋ก๊ทธ๋จ ์ฌ๋ฟ์ผ๋ก ๋๋ ์ ์์ผ๋ฉฐ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ฝ๋ค.
์ฒ๋ฆฌ๋ ๋ํ ํฅ์๋ ์ ์๋ค. ํ ์ ์ ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ์ 1์ด๊ฐ ํ์ํ ์์คํ ์ ์๊ฐํด ๋ณด์. ์ด ์์คํ ์ ์ ์ ์ ์ ๊ฐ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ทธ๋ญ์ ๋ญ ๊ด์ฐฎ์ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ค ๊ฒ์ด๋ค. ํ์ง๋ง ์ ์ ๊ฐ ๋์ด๋จ์ ๋ฐ๋ผ ๋ชจ๋ ์ ์ ๋ ์์ ๋ณด๋ค ๋จผ์ ๋์ฐฉํ ์์ฒญ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ๋ง ํ๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ concurrency๊ฐ ์ฌ๋ฌ ์ ์ ๋ฅผ ๋์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฒ๋ฆฌ๋์ ํฅ์์ํฌ ์ ์๋ค.
๋ฏธ์ ๊ณผ ์คํด
Concurrency๋ ํญ์ ํผํฌ๋จผ์ค๋ฅผ ํฅ์์ํจ๋ค.
ํญ์ ๊ทธ๋ฐ ๊ฒ๋ง์ ์๋๋ค. Concurrency๋ ์ฌ๋ฌ ์ค๋ ๋ ํน์ ์ฌ๋ฌ ํ๋ก์ธ์๊ฐ
๋๊ธฐ ์๊ฐ์ ๊ณต์
ํ ์ ์๋ ๊ฒฝ์ฐ์๋ง ํผํฌ๋จผ์ค๋ฅผ ํฅ์์ํจ๋ค. ํ์ง๋ง ์ด๋ฌํ ๊ฒฝ์ฐ๋ ๋๋ฌผ๋ค. ๋ํ Context Switching์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ํผํฌ๋จผ์ค, ์ฝ๋ ์์ฑ ์์ชฝ ๋ชจ๋์ ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ์ผ์ผํจ๋ค.
Concurrency๋ ์์คํ ์ ๋์์ธ์ ๋ณ๊ฒฝ์ํค์ง ์๋๋ค.
โ๋ฌด์โ๊ณผ โ์ธ์ โ๋ฅผ ๋ถ๋ฆฌํ๋ ์์ ์ ๋ณดํต ์์คํ ์ ๊ตฌ์กฐ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค. Concurrency ๋ฌธ์ ์๋ ๋ณดํต ๊ทผ๋ณธ์ ์ธ ๋์์ธ ๊ฐํธ์ด ํ์ํ๋ค.
Web๋ EJB์ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด Concurrency ๋ฌธ์ ๋ค์ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.
์ปจํ ์ด๋๊ฐ ์ด๋ค ์ผ์ ํ๋๊ฐ์ ๋ํด ์์์ผ ํ๋ฉฐ Concurrency update, Deadlock์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์์์ผ ํ๋ค.
Concurrency ๊ด๋ จ ๋ฒ๊ทธ๋ ์ฌํํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ์ข ์ข one-off 2๋ก ์ทจ๊ธ๋๋ค.
์ Concurrency๋ ๊ตฌํํ๊ธฐ ์ด๋ ค์ด๊ฐ?
public class ClassWithThreadingProblem {
private int lastIdUsed;
public ClassWithThreadingProblem(int lastIdUsed) {
this.lastIdUsed = lastIdUsed;
}
public int getNextId() {
return ++lastIdUsed;
}
public static void main(String args[]) {
final ClassWithThreadingProblem classWithThreadingProblem = new ClassWithThreadingProblem(42);
Runnable runnable = new Runnable() {
public void run() {
classWithThreadingProblem.getNextId();
}
};
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
t1.start();
t2.start();
}
}
๊ฒฐ๊ณผ๋ ์ด 3๊ฐ์ง ์ด๋ค.
- t1์ด 43์, t2๊ฐ 44๋ฅผ ๊ฐ์ ธ๊ฐ๋ค. lastIdUsed๋ 44์ด๋ค.(O)
- t1์ด 44์, t2๊ฐ 43๋ฅผ ๊ฐ์ ธ๊ฐ๋ค. lastIdUsed๋ 44์ด๋ค.(O)
- t1์ด 43์, t2๊ฐ 43๋ฅผ ๊ฐ์ ธ๊ฐ๋ค. lastIdUsed๋ 43์ด๋ค.(X)
์์ getNextId() ๋ฉ์๋๋ 8๊ฐ์ ์๋ฐ byte-code๋ก ๋ณํ๋๋ฉฐ, ์ด๋ฅผ ๋ ์ค๋ ๋์์ ์คํํ๊ฒ ๋๋ฉด ์ด 12,870๊ฐ์ ์ฝ๋ ์กฐํฉ์ ๋ผ ์ ์๋ค. ๊ทธ ์ค ์ผ๋ง ์ ๋๋ ๋ช๋ช ์กฐํฉ์ด ์์ 3๊ฐ์ง ๊ฒฐ๊ณผ ์ค ๋ง์ง๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒ ๋๋ค.
๋์์ฑ ๋ฐฉ์ด ์์น
๋จ์ผ ์ฑ ์ ์์น(Single Responsibility Principle, SRP)
Concurrency ๋์์ธ์ ๊ทธ ์์ฒด๋ก ์ถฉ๋ถํ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ concurrency ๊ด๋ จ ์ฝ๋๋ ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
- Concurrency ๊ด๋ จ ์ฝ๋๋ ๊ฐ๋ฐ, ๋ณ๊ฒฝ, ํ๋์ ๋ค๋ฅธ ์ฝ๋์ ๋ถ๋ฆฌ๋ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
- Concurrency ๊ด๋ จ ์ฝ๋๋ ๊ทธ ์์ฒด๊ฐ ๊ฐ์ง๋ ์ด๋ ค์(ํ๊ธฐ ํ๋ ๋ฌธ์ )์ด ์๋ค.
- ์๋ชป ์์ฑ๋ concurrency ์ฝ๋๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์์ผ๋ฉฐ, ์ด๋ ์ถ๊ฐ์ ์ธ ์ฝ๋ ์์ด ํด๊ฒฐ๋๊ธฐ ํ๋ค๋ค.
Concurrency ๊ด๋ จ ์ฝ๋๋ ๋ค๋ฅธ ์ฝ๋๋ค๊ณผ ๋ถ๋ฆฌํ๋ผ.
๋ฐ๋ฆ ์ ๋ฆฌ(Corollary): ์๋ฃ ๋ฒ์๋ฅผ ์ ํํ๋ผ
๊ณต์ ๊ฐ์ฒด๋ฅผ ๋ ์ค๋ ๋์์ ์์ ํ๋ ์ค ๊ฐ์ญ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์ด๋ ์๊ธฐ์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค. ์ด๋ฌํ critical section์ ๋ณดํธํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ synchronized ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. Critical section์ ์๋ ๊ฐ๋ฅํํ ์ ๊ฒ ๋ง๋ค์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ด๊ธธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ๊ฒ ๋๋ค.
- ํ๋ ๊ตฐ๋ฐ๋ฅผ ๋ณดํธํ๋ ๊ฒ์ ๊น๋จน๊ธฐ ์ฌ์ฐ๋ฉฐ ์ด๋ก ์ธํด ํด๋น ์์์ ์์ ํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ง๊ฐํธ๋ฆฌ๊ฒ ๋๋ค.
- ๋ชจ๋ ๊ณณ์ด ๋ณดํธ๋์๋์ง ํ์ ํ๊ธฐ ์ํด ์ค๋ณต์ ์ธ ๋ ธ๋ ฅ์ด ํ์ํ๊ฒ ๋๋ค.
- ์ด๋ฏธ ์ฐพ๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ์ ๊ทผ์์ ๋ ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ฒ ๋๋ค.
๋ฐ์ดํฐ ์บก์ํ๋ฅผ ๊ฐ์ด ๊น์ด ์๊ธฐ๋ฉฐ, ๊ณต์ ๋ ๋งํ ์์์ ์ ๊ทผํ๋ ๋ถ๋ถ(์ฝ๋)์ ๊ทน๋๋ก ์ค์ฌ๋ผ.
๋ฐ๋ฆ ์ ๋ฆฌ: ์๋ฃ ์ฌ๋ณธ์ ์ฌ์ฉํ๋ผ
- ๊ณต์ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ค ํ๋๋ ์ ์ด์ ๊ณต์ ์์์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด๋ค.
- ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฌ์ฉ๋ ๊ฒฝ์ฐ ์์์ ๋ณต์ฌ๋ณธ์ ์ฌ์ฉํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ๋ณต์ฌ๋ณธ์ ์ฌ๋ฌ ์ค๋ ๋์ ์ ๋ฌ, ์์ ์ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋จ์ผ ์ค๋ ๋์์ ์์งํด ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
- ๊ฐ์ฒด์ ๋ณต์ฌ์ ๋๋ ๋น์ฉ์ ๊ฑฑ์ ํ ์๋ ์๋ค. ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ์ฌ์ฉํจ์ผ๋ก์จ ๋๊ธฐํ๋ฅผ ํผํ ์ ์๋ค๋ฉด, ๊ฐ์ฒด ์์ฑ ๋ฐ GC์ ๋๋ ๋น์ฉ์ ๊ณต์ ์์ ๋๊ธฐํ์ ํ์ํ ๋น์ฉ ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ์ ์ ๋น์ฉ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ํด ์ค๋ค.(๊ฐ์ฒด ๋ณต์ฌ cost < ๊ณต์ ์์ ๋๊ธฐํ cost)
๋ฐ๋ฆ ์ ๋ฆฌ: ์ค๋ ๋๋ ๊ฐ๋ฅํ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ๋ผ
- ์ค๋ ๋ ์ฝ๋๋ฅผ ๊ณต์ ์์์ ์ฌ์ฉํ์ง ์๋ ๋ ๋ฆฝ๋ ์ธ๊ณ๋ก ๋ง๋ ๋ค๋ฉด ๋๊ธฐํ ๋ฌธ์ ๋ ์์ด์ง๊ฒ ๋๋ค. HttpServlet์ ์๊ฐํด ๋ณด๋ผ. HttpServlet์ ์์๋ฐ๋ ํด๋์ค๋ doGet, doPost์ ๊ฐ์ ๋ฉ์๋์์ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ค. ์ด๋ ๊ฐ Servlet์ด ๊ฐ์์ ์ธ๊ณ์ ์๋ ๊ฒ์ฒ๋ผ ์๋ํ๊ฒ ๋์์ฃผ๋ฉฐ, ์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ํ ๋๊ธฐํ ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค. ๋ฌผ๋ก ๋๋ถ๋ถ์ Servlet๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ๊ณต์ ์์์ด ํ์ํ๊ธด ํ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ค๋ ๋ ๋ ๋์๊ฐ ๊ฐ๊ฐ์ ํ๋ก์ธ์์์ ์ฌ์ฉ๋ ์ ์๊ฒ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก ๋ถํ ํ๋ผ.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํดํ๊ธฐ
- ์๋ฐ์์ ์ ๊ณตํ๋ thread-safe ์ปฌ๋์ ์ ์ฌ์ฉํ๋ผ. ex) ConCurrentHashMap, Vector
- ์ฐ๊ด์ด ์๋ ํ์คํฌ๋ค์ ์ํ์ executor ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ผ.
- ๊ฐ๋ฅํ๋ฉด nonblocking ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ผ.
- ๋ช๋ช ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋์ค๋ค์ thread-safeํ์ง ์๋ค.
Thread Safe ์ปฌ๋ ์
java.util.concurrent
ํจํค์ง๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ์ปฌ๋์
๋ค์ ์ ๊ณตํ๋ค. ConcurrentHashMap์ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ HashMap๋ณด๋ค ๋๋ถ๋ถ์ ์ํฉ์์ ๋ ์ข์ ํผํฌ๋จผ์ค๋ฅผ ์ ๊ณตํ๋ค. ๋ง์ฝ ๋ฐฐํฌ ํ๊ฒฝ์ด ์๋ฐ 5๋ฒ์ ์ด์์ด๋ผ๋ฉด ์ด ํจํค์ง๋ฅผ ํ์ฉํ์.
์๋์ ๊ฐ์ ๊ณ ๊ธ concurrency ๋์์ธ ๊ตฌํ์ ์ํ ์ปดํฌ๋ํธ๋ค๋ ์์งํ์.
Name | Description |
---|---|
ReentrantLock | ํ ๋ฉ์๋์์ ์ ๊ทธ๊ณ ๋ค๋ฅธ ๋ฉ์๋์์ ํด์ ๋ ์ ์๋ lock์ด๋ค. |
Semaphore | ์ ํต์ ์ธ ์ธ๋งํฌ์ด(๊ฐฏ์๋ฅผ ์ ์ ์๋ lock)์ ๊ตฌํ์ฒด์ด๋ค. |
CountDownLatch | ๊ธฐ๋ค๋ฆฌ๋ ๋ชจ๋ ์ค๋ ๋๋ค์ ํด์ ํ๊ธฐ ์ ํน์ ํ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ์ ์๋ lock์ด๋ค. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฑฐ์ ๋์์ ์์๋ ์ ์๊ฒ ๋์์ค ์ ์๋ค. |
๋น์ ์๊ฒ ๋ง๋ ํด๋์ค๋ฅผ ์ดํด๋ณด๋ผ. ์๋ฐ์ ๊ฒฝ์ฐ java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks๋ฅผ ์ดํด๋ณด๋ผ.
์คํ ๋ชจ๋ธ ์ดํดํ๊ธฐ
Name | Description |
---|---|
ํ์ ๋ ์์(Bound Resource) | ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ์์์ผ๋ก ํฌ๊ธฐ๋ ์ซ์๊ฐ ์ ํ์ ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ, ๊ธธ์ด๊ฐ ์ผ์ ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฒํผ ๋ฑ์ด ์๋ค. |
์ํธ ๋ฐฐ์ (Mutual Exclusion) | ํ ๋ฒ์ ํ ์ค๋ ๋๋ง ๊ณต์ ์๋ฃ๋ ๊ณต์ ์์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. |
๊ธฐ์(Starvation) | ํ ์ค๋ ๋๋ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ต์ฅํ ์ค๋ซ๋์ ํน์ ์์ํ ์์์ ๊ธฐ๋ค๋ฆฐ๋ค. |
๋ฐ๋๋ฝ(Deadlock) | ์ฌ๋ฌ ์ค๋ ๋๊ฐ ์๋ก๊ฐ ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ฐ๊ธฐ ํ์ํ ์์์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ์ ํ๋ ๋ฐ๋์ ์ด๋ ์ชฝ๋ ๋ ์ด์ ์งํํ์ง ๋ชปํ๋ค. |
๋ผ์ด๋ธ๋ฝ(Livelock) | ๋ฝ์ ๊ฑฐ๋ ๋จ๊ณ์์ ๊ฐ ์ค๋ ๋๊ฐ ์๋ก๋ฅผ ๋ฐฉํดํ๋ค. |
์์ฐ์ - ์๋น์(Produce-Consumer)
ํ ๊ฐ ์ด์์ ์์ฐ์๊ฐ ์์ฐํ ์์
๋ฌผ์ ๋ฒํผ ํน์ ํ์ ๋ฃ๋๋ค. ํ ๊ฐ ์ด์์ ์๋น์๊ฐ ๋ฒํผ ํน์ ํ์์ ์์
๋ฌผ์ ์ต๋, ์์
์ ๋ง์น๋ค. ์์ฐ์์ ์๋น์ ์ฌ์ด์ ์๋ ํ๋ bound resource
์ด๋ค. ๋ฐ๋ผ์ ์์ฐ์๋ ํ์ ๋จ๋ ๊ณต๊ฐ์ด ์๊ธธ ๋๊น์ง, ์๋น์๋ ํ์ ์์
๋ฌผ์ด ํ๋๋ผ๋ ์๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ํ๋ฅผ ํตํ ์์ฐ์์ ์๋น์๊ฐ์ ์กฐ์จ์๋ ๋ ์ฌ์ด์ ์๊ทธ๋๋ง์ด ํ์ํ๋ค. ์์ฐ์๋ ํ์ ์์
๋ฌผ์ ๋ฃ๊ณ ์๋น์์๊ฒ โํ๊ฐ ๋น์ด์์ง ์๋คโ๋ ์ ํธ๋ฅผ ๋ณด๋ด๊ณ ์๋น์๋ ํ์์ ์์
๋ฌผ์ ๊บผ๋ธ ํ โํ๊ฐ ๊ฐ๋์ฐจ ์์ง ์๋คโ๋ ์ ํธ๋ฅผ ๋ณด๋ธ๋ค. ๊ทธ ์ ๊น์ง ๋์ ์ ํธ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
์ฝ๊ธฐ-์ฐ๊ธฐ(Readers-Writers)
์ผ๋ฐ์ ์ผ๋ก ๋ ์๋ฅผ ์ํ ์ ๋ณด๋ก ์ฌ์ฉ๋๋ฉฐ, ๊ฐ๋ ์ ์์ ์ํด ์ ๋ฐ์ดํธ๋๋ ๊ณต์ ์์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋์ด ๋ฌธ์ ๊ฐ ๋๋ค. ์ฒ๋ฆฌ๋์ ๊ฐ์กฐํด ๋ ์๊ฐ ์๋์ ์ธ ์ฐ์ ๊ถ์ ๊ฐ์ง๊ฒ ๋๋ฉด ์ ์๋ ๊ธฐ์ ์ํ์ ๋น ์ง๋ฉฐ ๊ณต์ ์์์ ์ ์ฒด๋ ์ ๋ณด๋ก ๊ฐ๋์ฐจ๊ฒ ๋๋ค. ๋ฐ๋๋ก ์ ์๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ฉด ์ฒ๋ฆฌ๋์ด ์ค์ด๋ค๊ฒ ๋๋ค. ์ ์-๋ ์ ๋ฌธ์ ๋ ์ด ๋ ์ฌ์ด์ ๊ท ํ์ ๋ง์ถ๋ฉฐ concurrent ์ ๋ฐ์ดํธ๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ์ฃผ์์ ์ผ๋ก ๋๋ค.
์์ฌํ๋ ์ฒ ํ์๋ค(Dining Philosophers)
์ํ์ ๋๋ฌ์ผ ์ฌ๋ฌ ๋ช ์ ์ฒ ํ์๋ค์ด ์๋ค. ๊ฐ ์ฒ ํ์์ ์ผ์ชฝ์ ํฌํฌ๊ฐ ๋์ฌ ์์ผ๋ฉฐ ํ ์ด๋ธ์ ์ค์์ ํฐ ์คํ๊ฒํฐ ํ ๊ทธ๋ฆ์ด ๋์ฌ ์๋ค. ๊ทธ๋ค์ ๋ฐฐ๊ฐ ๊ณ ํ์ง๊ธฐ ์ ๊น์ง ๊ฐ์ ์๊ฐ์ ํ๋ฉฐ ์๊ฐ์ ๋ณด๋ธ๋ค. ๋ฐฐ๊ฐ ๊ณ ํ์ง๋ฉด ๊ทธ๋ค์ ์์ ์ ์์ชฝ์ ๋์ฌ ์๋ ํฌํฌ 2๊ฐ๋ฅผ ์ก๊ณ ์คํ๊ฒํฐ๋ฅผ ๋จน๋๋ค. ์ฒ ํ์๋ ํฌํฌ 2๊ฐ๊ฐ ์์ด์ผ๋ง ์คํ๊ฒํฐ๋ฅผ ๋จน์ ์ ์๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ์ ์ฌ๋์ด ํฌํฌ๋ฅผ ๋ค ์ฌ์ฉํ๊ธฐ ์ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ์คํ๊ฒํฐ๋ฅผ ๋จน์ ์ฒ ํ์๋ ๋ค์ ๋ฐฐ๊ฐ ๊ณ ํ์ง ๋๊น์ง ํฌํฌ๋ฅผ ๋๊ณ ์๊ฒ ๋๋ค. ์ ์ํฉ์์ ์ฒ ํ์๋ฅผ ์ค๋ ๋๋ก, ํฌํฌ๋ฅผ ๊ณต์ ์์์ผ๋ก ๋ฐ๊พธ๊ฒ ๋๋ฉด ์ด๋ ์์์ ๋๊ณ ๊ฒฝ์ํ๋ ํ๋ก์ธ์ค์ ๋น์ทํ ์ํฉ์ด ๋๋ค. ์ ์ค๊ณ๋์ง ์์ ์์คํ ์ deadlock, livelock, ์ฒ๋ฆฌ๋ ๋ฌธ์ , ํจ์จ์ฑ ์ ํ ๋ฌธ์ ์ ๋ง๋ฅ๋จ๋ฆฌ๊ธฐ ์ฝ๋ค. ๋น์ ์ด ๋ง๋ฅ๋จ๋ฆด ๋๋ถ๋ถ์ concurrent๊ด๋ จ ๋ฌธ์ ๋ค์ ์ด ์ธ ๊ฐ์ง ๋ฌธ์ ์ ๋ณํ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ๋ค์ ๊ณต๋ถํ๊ณ ์ค์ค๋ก ํด๋ฒ์ ์์ฑํจ์ผ๋ก์จ ์ด์ ๊ฐ์ ๋ฌธ์ ๋ค์ ์ง๋ฉดํ๋๋ผ๋ ์์ฐํ๊ฒ ๋์ฒํ ์ ์๋๋ก ํ์.
๋๊ธฐํํ๋ ๋ฉ์๋ ์ฌ์ด์ ์กด์ฌํ๋ ์์กด์ฑ์ ์ดํดํ๋ผ.
๋๊ธฐํ๋ ๋ฉ์๋ ๊ฐ์ ์์กด์ฑ์ concurrent ์ฝ๋์์ ์ฌ์ํ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. ์๋ฐ๋ synchronized๋ผ๋ โ๋ฉ์๋ ํ๋๋ฅผ ๋ณดํธํ๋ ๋ ธํ ์ด์ โ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ํ ํด๋์ค์ ๋ ๊ฐ ์ด์์ synchronized ๋ฉ์๋๊ฐ ์กด์ฌํ๋ฉด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์๋ ์๋ค.
์ถ์ฒ: ๊ณต์ ๋ ๊ฐ์ฒด์ ๋ ๋ฉ์๋ ์ด์์ ์ฌ์ฉํ๋ ๊ฒ์ ํผํ๋ผ.
๋ง์ฝ ์ ์ถ์ฒ์ ๋ฐ๋ฅผ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์๋์ ์ธ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด ๋ณด๋ผ.
ํด๋ผ์ด์ธํธ ๊ธฐ๋ฐ ์ ๊ธ(Client-Based Locking)
- ํด๋ผ์ด์ธํธ๊ฐ ์ฒซ ๋ฉ์๋๋ฅผ ๋ถ๋ฅด๊ธฐ ์ด์ ๋ถํฐ ๋ง์ง๋ง ๋ฉ์๋๋ฅผ ๋ถ๋ฅธ ๋ค์๊น์ง ์๋ฒ๋ฅผ ์ ๊ทผ๋ค.
Bad: ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ฝ๋์์ lock์ด ํ์ํ๊ฒ ๋๋ฉฐ ์ด๋ ์ ์ง๋ณด์ ๋ฐ ๋๋ฒ๊น ์ ํ์ํ ๋น์ฉ์ ์์น์ํจ๋ค.
์๋ฒ ๊ธฐ๋ฐ ์ ๊ธ(Server-Based Locking)
- ์๋ฒ ๋ด์์ ์๋ฒ(์์ )์ ์ ๊ทธ๊ณ ๋ชจ๋ ๋์์ ์ํํ ํ ์ ๊ธ์ ํธ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ํด๋ผ์ด์ธํธ์๊ฒ๋ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
Good: Critical section์ ์ ๊ทผํ๋ ์ฝ๋๋ฅผ ์ต์ํํด ์ 4-2์ ๋ถํฉํ๋ค.
์ค๊ณ๋ ์๋ฒ(Adapted Server)
- ์ ๊ธ์ ์ํํ๋ ์ค๊ณ์๋ฅผ ์์ฑํ๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ๊ธฐ๋ฐ ์ ๊ธ์ด์ง๋ง ๊ธฐ์กด์ ์๋ฒ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ์ํฉ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
Good: ์๋ฒ ๊ธฐ๋ฐ ์ ๊ธ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ์.
๋๊ธฐํํ๋ ๋ถ๋ถ์ ์ต๋ํ ์๊ฒ ๋ง๋ค์ด๋ผ
- Synchronized๋ก ์ํ๋๋ ์ ๊ธ์ ๋๋ ์ด์ ์ค๋ฒํค๋๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ โ๋น์ผ ์ํโ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ ๊ฐ๋ฅํ ํ ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ค. ๋ฐ๋ฉด critical section์ ๊ผญ ๋ณดํธ๋์ด์ผ ํ๋ค.
์ฌ๋ฐ๋ฅธ ์ข ๋ฃ ์ฝ๋๋ ๊ตฌํํ๊ธฐ ์ด๋ ต๋ค
โํญ์ ์ด์ ์์ด์ผ ํ๋ ์ฝ๋โ์ ์์ฑ์ โ์ ์ ๋์ํ๊ณ ์กฐ์ฉํ ๋๋๋โ ์ฝ๋์ ์์ฑ๊ณผ๋ ๋ค๋ฅด๋ค. ์กฐ์ฉํ ๋๋๋ ์ฝ๋๋ ์์ฑํ๊ธฐ ์ด๋ ต๋ค. ์ด๋ ๋ณดํธ์ ์ผ๋ก โ์ค์ง ์์ ์ ํธโ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ฐ๋ ๋์ ๋ฐ๋๋ฝ์ ํฌํจํ๋ค. ๋ฐ๋๋ฝ์ ๊ฑธ๋ฆฐ ์์ ์ค๋ ๋์ ์ํ์ด ๋๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ๋ถ๋ชจ ์ค๋ ๋์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด๋ผ. ์์์ ๋ฐ๋๋ฝ์ ๊ฑธ๋ ค ๋ฉ์ถฐ ์๊ณ ๋ถ๋ชจ๋ ์ด๋ฅผ ๋์์ด ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค. ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์ ์์ ์ธ ์ข ๋ฃ๊ฐ ์ด๋ฃจ์ด์ง ๋๊น์ง ๋ง์ ์๊ฐ์ด ์์๋ ๊ฒ์ ์์ ํด์ผ ํ๋ค.
์ถ์ฒ: ๊ฐ๋ฐ ์ด๊ธฐ์ ์์คํ ์ข ๋ฃ์ ๋ํด ๊ณ ๋ฏผํ๊ณ ๊ตฌํํ๋ผ. ์ด ์์ ์ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆด ๊ฒ์ด๋ค. ๊ธฐ์กด์ ๊ตฌํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฆฌ๋ทฐํ๋ ๊ฒ๋ ํ์ํ๋ค.
์ค๋ ๋ ์ฝ๋ ํ ์คํธํ๊ธฐ
- ํ ์คํธ๋ ์ ํ์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ โ์ฝ๋๊ฐ ์ ๋๋ก ์์ฑ๋์๋๊ฐโ๋ฅผ ์ฆ๋ช ํ ์ ์๋ค. ๋ค๋ง ์ ์์ฑ๋ ํ ์คํธ๋ ์ํ์ ์ต์ํํ ์ ์๋ค. ์ด๋ ๋ฉํฐ ์ค๋ ๋ ์ํฉ์์๋ ํจ์ฌ ๋ ๋ณต์กํด ์ง๋ค.
์ถ์ฒ: ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ๋งํ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ ์ค์ ๊ณผ ์์คํ ์ค์ , ๋ถํ ํ์์ ์์ฃผ ์ํํ๋ผ. ํ ์คํธ๊ฐ ํ๋ฒ์ด๋ผ๋ ์คํจํ๋ค๋ฉด ์์ธ์ ๋ถ์ํ๋ผ. ํ๋ฒ ๋ ํ ์คํธ๋ฅผ ์คํํด ์ฑ๊ณตํ๋ค๊ณ ํด์ ์ด์ ์ ์คํจ๋ฅผ ๋ฌด์ํ์ง ๋ง๋ผ.
- ๋ง์ด ์ ๋๋ ์คํจ๋ ์ ์ ์ ์ธ ์ค๋ ๋ ๋ฌธ์ ๋ก ์ทจ๊ธํ๋ผ
- ๋ค์ค ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ์ง ์์ ์์ฐจ ์ฝ๋๋ถํฐ ์ ๋๋ก ๋๊ฒ ๋ง๋ค์
- ๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ๋ค์ํ ํ๊ฒฝ์ ์ฝ๊ฒ ๋ผ์ ๋ฃ์ ์ ์๊ฒ ์ค๋ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ
- ๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ์ํฉ์ ๋ง๊ฒ ์กฐ์จํ ์ ์๊ฒ ์์ฑํ๋ผ
- ํ๋ก์ธ์ ์๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ๋๋ ค๋ณด๋ผ
- ๋ค๋ฅธ ํ๋ซํผ์์ ๋๋ ค๋ณด๋ผ
- ์ฝ๋์ ๋ณด์กฐ ์ฝ๋instrument๋ฅผ ๋ฃ์ด ๋๋ ค๋ผ. ๊ฐ์ ๋ก ์คํจ๋ฅผ ์ผ์ผํค๊ฒ ํด๋ณด๋ผ
๋ง์ด ์ ๋๋ ์คํจ๋ ์ ์ ์ ์ธ ์ค๋ ๋ ๋ฌธ์ ๋ก ์ทจ๊ธํ๋ผ
๋ฉํฐ ์ค๋ ๋ ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ ๋ฆฌ ์์ด ๋ณด์ด๋ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํจ๋ค. (์ ์๋ฅผ ํฌํจํ)๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ ํ์ง ๋ชปํ๋ค. ๋ํ ์ด๋ ๋งค์ฐ ๋๋ฌผ๊ฒ ๋ฐ์ํด ๊ฐ๋ฐ์๋ค์ ์ข์ ํ๊ฒ ๋ง๋ ๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๋ค์ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์ฐ์ฃผ์ (ๅฎๅฎ็ท), ํ๋์จ์ด ๋ฒ๊ทธ, ํน์ ์ด๋ฌํ ๋ฅ์ one-off๋ก ์น๋ถํ๋ค. ์ ์ผ ์ข์ ๋ฐฉํฅ์ one-off๋ ์๋ค๊ณ ํ๋จํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ one-off๋ค์ด ๋ฌด์๋ ์๋ก ๋ ๋ง์ ์ฝ๋๋ค์ด ์ด๋ฏธ ๋ฌธ์ ๊ฐ ์๋ ์์คํ ์ ์ถ๊ฐ๋๊ฒ ๋ ๋ฟ์ด๋ค.
์ถ์ฒ: ์์คํ ์ค์๋์ one-off๋ก ํ๋จํด ๋ฌด์ํ์ง ๋ง๋ผ.
๋ค์ค ์ค๋ ๋๋ฅผ ๊ณ ๋ คํ์ง ์์ ์์ฐจ ์ฝ๋๋ถํฐ ์ ๋๋ก ๋๊ฒ ๋ง๋ค์
๋น์ฐํ ๋ง์ด์ง๋ง ๊ฑฐ๋ญ ๊ฐ์กฐํ ๋งํผ ์ค์ํ ์ด์ผ๊ธฐ์ด๋ค. ์ค๋ ๋ ๋ฐ์์ ์ ๋์ํ๋ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๋ผ. ์ด๋ ์ค๋ ๋์์ ์ฌ์ฉ๋ POJO๋ฅผ ๋ปํ๋ค. POJO๋ ์ค๋ ๋์ ์ฐ๊ด์ด ์์ด ์ค๋ ๋ ๋ฐ์์๋ ํ ์คํธํ ์ ์๋ค. ์์คํ ์ ๊ฐ๋ฅํ ํ POJO๋ก ์์ฑํ๋ ๊ฒ์ด ์ข๋ค.
์ถ์ฒ: ์ค๋ ๋ ๊ด๋ จ ๋ฒ๊ทธ์ ๊ทธ๋ ์ง ์์ ๋ฒ๊ทธ๋ฅผ ๋์์ ์ก์ผ๋ ค ํ์ง ๋ง๋ผ. ์์ฑํ ์ฝ๋๊ฐ ์ค๋ ๋ ๋ฐ์์ ์ ์๋ํ๋์ง ๋จผ์ ์ฒดํฌํ๋ผ.
๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ๋ค์ํ ํ๊ฒฝ์ ์ฝ๊ฒ ๋ผ์ ๋ฃ์ ์ ์๊ฒ ์ค๋ ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ
Concurrency ์ง์ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์ฌ๋ฌ ์ค์ ์ผ๋ก ์คํ๋ ์ ์๊ฒ ๋ง๋ค์ด๋ผ. ๋จ์ผ ์ค๋ ๋, ์ฌ๋ฌ ์ค๋ ๋ ํ๊ฒฝ์์ ๋์ํ๊ฒ ๊ตฌํ ์ค์ ์ฌ์ฉ๋ ๊ฐ์ฒด ํน์ Test Double๊ณผ ์ํธ์์ฉํ ์ ์๋ ์ค๋ ๋ ์ฝ๋๋ก ๊ตฌํ ์ํ ์๋๋ฅผ ์กฐ์ ํ ์ ์๋ Test Double์ ๊ตฌํ ์ง์ ๋ ํ์๋งํผ ๋ฐ๋ณต ์ํํ ์ ์๊ฒ ๊ตฌํ
์ถ์ฒ: ์ค๋ ๋ ๊ธฐ๋ฐ ์ฝ๋๋ฅผ ์ฌ๋ฌ ํ๊ฒฝ์์ ์คํํ ์ ์๊ฒ ํ๋ผ.
๋ค์ค ์ค๋ ๋๋ฅผ ์ฐ๋ ์ฝ๋ ๋ถ๋ถ์ ์ํฉ์ ๋ง๊ฒ ์กฐ์จํ ์ ์๊ฒ ์์ฑํ๋ผ
์ค๋ ๋ ๊ด๋ จ ์ฝ๋์ ์ ์ ํ ๊ท ํ์ ๋ง์ถ๋ ์์ ์ ๋ณดํต ์ํ์ฐฉ์ค๋ฅผ ํ์๋ก ํ๋ค. ์ฌ๋ฌ ํ๊ฒฝ์์ ์์คํ ์ ํผํฌ๋จผ์ค๋ฅผ ํ ์คํธํ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ ์ด๊ธฐ์ ๊ฐ๊ตฌํ๋ผ. ์คํํ ์ค๋ ๋ ๊ฐฏ์๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๊ฒ ์์ฑํ๋ผ. ์ด๋ฅผ ์์คํ ์ด ๋์ํ๋ ๋์ค์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด๋ผ. ์ฒ๋ฆฌ๋๊ณผ ์์คํ ํ์ฉ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ค๋ก๋ฅผ ์กฐ์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด๋ผ.
ํ๋ก์ธ์ ์๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ๋๋ ค๋ณด๋ผ
์์คํ ์ด ์์ ์ ์ ํํ ๋์๋ ๋ฌธ์ ๋ ๋ฐ์ํ๋ค. ์์ ์ ํ์ ๋น๋ฒํ ๋ฐ์ํ๊ฒ ํ๊ธฐ ์ํด ํ๋ก์ธ์ ์๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ์คํํด ๋ณด๋ผ. ์์ ์ ํ์ด ์ฆ์์๋ก ๋น ๋จ๋ฆฐ critical section์ด๋ dead lock์ ์ฐพ์ ํ๋ฅ ์ด ๋์์ง๊ฒ ๋๋ค.
๋ค๋ฅธ ํ๋ซํผ์์ ๋๋ ค๋ณด๋ผ
์ฐ๋ฆฌ(์ ์)๋ 2007๋ ์ค์ concurrent ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ข๋ฅผ ๊ฐ๋ฐํ๋ค. ๊ฐ์ข์ ๊ฐ๋ฐ์ OSX์์ ์งํ๋์์ผ๋ฉฐ ์์ฐ์ VM์์ Windows XP์์ ์งํ๋์๋ค. ํ์ง๋ง ์คํจ๋ฅผ ์์ฐํ๊ธฐ ์ํด ์์ฑ๋ ํ ์คํธ๋ OSX์์๋ ์์ฃผ ๋ฐ์ํ์ง๋ง Windows XP์์๋ OSX์์๋งํผ ์์ฃผ ๋ฐ์ํ์ง ์์๋ค. ์ฐ๋ฆฌ๋ ์ด๋ก ์ธํด ์๋ก ๋ค๋ฅธ ์ด์์ฒด์ ๋ ์์ดํ ์ค๋ ๋ฉ ์ ์ฑ ์ ๊ฐ์ง๋ฉฐ ์ฝ๋์ ์คํ์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ๋ค์ ํ๋ฒ ๊นจ๋ซ๊ฒ ๋์๋ค. ๋ฉํฐ ์ค๋ ๋ ์ฝ๋๋ ์คํ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ๋ฐ๋ผ์ ๋น์ ์ ๋ชจ๋ ์ ์ฌ์ ๋ฐฐํฌ ํ๊ฒฝ์ ๋ํด ํ ์คํธ๋ฅผ ์ํํด์ผ ํ๋ค. ์ถ์ฒ: ์ค๋ ๋ ๊ด๋ จ ์ฝ๋๋ฅผ ์ด๋ฅธ ์๊ธฐ์, ๋น๋ฒํ ์ฃผ๊ธฐ๋ก ๋ชจ๋ ํ๊ฒ ํ๋ซํผ์์ ์ํํ๋ผ.
์ฝ๋์ ๋ณด์กฐ ์ฝ๋instrument๋ฅผ ๋ฃ์ด ๋๋ ค๋ผ. ๊ฐ์ ๋ก ์คํจ๋ฅผ ์ผ์ผํค๊ฒ ํด๋ณด๋ผ
์ค๋ ๋ ๊ด๋ จ ๋ฌธ์ ๋ ์๋ง์ ์คํ ๊ฒฝ๋ก์ค ์ผ๋ง ์๋๋ ํ๋ฅ ๋ก ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ฌผ๊ฒ ๋ฐ์ํ๋ฉฐ ์ฌํํ๊ธฐ ์ด๋ ต๋ค. ์ด ์คํ ๊ฒฝ๋ก๋ฅผ ์กฐ์ํด ์ค๋ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ ๋์ด๋ code instrumentation์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ์ง์ ๊ตฌํํ๊ธฐ
- ์๋ํ
์ง์ ๊ตฌํํ๊ธฐ
์ด๋ Object.wait(), Object.sleep(), Object.yield(), Object.priority()๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์คํ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํจ์ผ๋ก์จ ์ฝ๋์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
public synchronized String nextUrlOrNull() {
if(hasNext()) {
String url = urlGenerator.next();
Thread.yield();
// inserted for testing.
updateHasNext();
return url;
}
return null;
}
yield() ๋ฉ์๋๋ฅผ ํธ์ถํจ์ผ๋ก์จ ์ฝ๋์ ์คํ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๋ง์ฝ ์ ์ฝ๋์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ yield()๋ฅผ ์ถ๊ฐํด ์๊ธด ๋ฌธ์ ๊ฐ ์๋๋ผ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฌธ์ ๋ฅผ ๋ช ๋ฐฑํ ๋ง๋ ๊ฒ ๋ฟ์ด๋ค. ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
- ํ ์คํธํ ๋ถ๋ถ์ ์ง์ ์ฐพ์์ผ ํ๋ค.
- ์ด๋์ ์ด๋ ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ ํ ์ง ์๊ธฐ ์ด๋ ต๋ค.
- ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ์ ํ์ ํฌํจํด ๋ฐฐํฌํ๋ ๊ฒ์ ๋ถํ์ํ๊ฒ ํผํฌ๋จผ์ค๋ฅผ ์ ํ์ํฌ ๋ฟ์ด๋ค.
- Shotgun approach์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๋ณด์ฅ์ ์ป์ ์ ์๋ค.
์ฐ๋ฆฌ๋ ์ค์ ์ ํ์ ํฌํจ๋์ง ์์ผ๋ฉฐ ์ฌ๋ฌ ์กฐํฉ์ผ๋ก ์คํํด ์๋ฌ๋ฅผ ์ฐพ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. ์ด๋ฅผ ์ํด์๋ ์์คํ ์ ์ต๋ํ POJO ๋จ์๋ก ๋๋ instrument code๋ฅผ ์ฝ์ ํ ๋ถ๋ถ์ ์ฐพ๊ธฐ ์ฝ๊ฒ ํ๊ณ ์ฌ๋ฌ ์ ์ฑ ์ ๋ฐ๋ผ sleep, yield๋ฑ์ ์ฝ์ ํ ์ ์๊ฒ ํด์ผ ํ๋ค.
์๋ํ
์์ ๋ค๋ฅด๊ฒ Aspect-oriented Framework, CGLib, ASM๋ฑ์ ํตํด ํ๋ก๊ทธ๋จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์กฐ์ํ ์๋ ์๋ค. ์๋์ ์๋ฅผ ๋ณด์.
public class ThreadJigglePoint {
public static void jiggle() { }
}
public synchronized String nextUrlOrNull() {
if(hasNext()) {
ThreadJiglePoint.jiggle();
String url = urlGenerator.next();
ThreadJiglePoint.jiggle();
updateHasNext();
ThreadJiglePoint.jiggle();
return url;
}
return null;
}
์์ ๊ฐ์ด ๊ตฌํํ ํ ๊ฐ๋จํ Aspect๋ฅผ ์ด์ฉํด โ์๋ฌด ๊ฒ๋ ์ํ๊ธฐโ, โsleepโ, โyieldโ๋ฑ์ ๋ฌด์์๋ก ์ ํํ๊ฒ ํ ์ ์๋ค. ํน์ ThreadJigglePoint๊ฐ ๋ ๊ฐ์ง ๊ตฌํ์ ๊ฐ์ง๊ฒ ํ ์๋ ์๋ค. ์ฒซ ๋ฒ์งธ ๊ตฌํ์ ๋ฐฐํฌ์ฉ ์ฝ๋๋ฅผ ์ํ โ์๋ฌด ๊ฒ๋ ์ํ๊ธฐโ๋ฅผ ์ํํ๋ฉฐ ๋ ๋ฒ์งธ ๊ตฌํ์ โsleep, yield, ์๋ฌด ๊ฒ๋ ์ํ๊ธฐโ ์ค์ ํ๋๋ฅผ ๋ฌด์์๋ก ์ ํํ๋ ๊ฒ์ด๋ค. ๋ค์ ๊ฐ๋จํ๊ธด ํ์ง๋ง ์ข ๋ ์ ๊ตํ ํด์ ์ฌ์ฉํ๋ ๋์ ์ด ์ ๋๋ก ๊ตฌํํ๋ ๊ฒ๋ ์ ์ ํ ์ ํ์ผ ๊ฒ์ด๋ค.
ํน์ ์ด์ ๋น์ทํ ์์ ์ ์ํํด ์ฃผ๋ IBM์์ ๊ฐ๋ฐํ ConTest๋ผ๋ ํด๋ ์๋ค. ์ด๋ ์ํ์๋ง๋ค ๋ค๋ฅธ ์์๋ก ์ค๋ ๋๋ฅผ ์คํํ๊ฒ ๋ง๋ค์ด ์ค์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ ํ๋ฅ ์ ๊ทน์ ์ผ๋ก ๋์ฌ์ค๋ค.
๊ฒฐ๋ก
Concurrent ์ฝ๋๋ ์ ๋๋ก ์์ฑํ๊ธฐ ์ด๋ ต๋ค. ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ ์ฌ๋ฌ ์ค๋ ๋์ ๊ณต์ ์์์ด ์ฎ์ด๊ฒ ๋๋ฉด ๋์ฐํ ๊ฒฐ๋ง์ ๋ณ๊ฒ ๋๋ค. ๋น์ ์ด concurrent code๋ฅผ ์์ฑํ๊ฒ ๋๋ค๋ฉด ์๊ฒฉํ ๊ธฐ์ค์ผ๋ก cleanํ๊ฒ ์์ฑํ๋ผ.
๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐพ๊ธฐ ์ด๋ ต๊ณ ๋น๋ฒํ์ง ์์ ์ค๋ฅ๋ฅผ ๋ง๋๊ฒ ๋ ๊ฒ์ด๋ค. ์ต์ฐ์ ์ ์ผ๋ก SRP๋ฅผ ์์งํ๋ผ. ์์คํ ์ ์ต๋ํ POJO๋จ์๋ก ์๋ผ ์ค๋ ๋ ๊ด๋ จ ์ฝ๋์ ้ ์ค๋ ๋ ๊ด๋ จ ์ฝ๋๋ฅผ ๋๋์ด๋ผ. ์ค๋ ๋ ๊ด๋ จ ์ฝ๋๋ฅผ ํ ์คํธํ ๋์๋ ๊ทธ ์ด์ธ์ ๊ฒ๋ค์ ์ ์ธํ๊ณ ์ค๋ ๋ ๊ด๋ จ ๋ฌธ์ ๋ง ํ ์คํธํ๋ผ. ์ด๋ ์ค๋ ๋ ๊ด๋ จ ๋ฌธ์ ๊ฐ ์ต๋ํ ์์ ๋ถ๋ถ์ ์ง์ค๋๊ฒ ํ๋ค.
ํ ๊ณต์ ์์์ ๋ํ ๋ฉํฐ ์ค๋ ๋ ์ํ, ๊ณต์ ๋๋ ์์ ํ ๋ฑ concurrency ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ๋ถ๋ถ์ ๋ํด ์ธ์งํ๋ผ. ๊น๋ํ๊ฒ ์ข ๋ฃ๋๊ฒ ํ๋ ๋ฌธ์ ๋ ๋ฐ๋ณต๋ฌธ ํ์ถ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ ํนํ ์ฑ๊ฐ์ค ์ ์๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๊ธฐ๋ณธ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ์ดํดํ๋ผ. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง ์ดํดํ๋ผ.
์ ๊ฐ์ผ ํ ํ์๊ฐ ์๋ ๋ถ๋ถ์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ ๊ฐ๋ผ. ์ธ๋ฐ ์๋ ๊ตฌ๊ฐ์ ์ ๊ทธ์ง ๋ง๋ผ. ์ ๊ธด ๊ตฌ๊ฐ์์ ๋ ๋ค๋ฅธ ์ ๊ธด ๊ตฌ๊ฐ์ ๋ถ๋ฅด๋ ๊ฒ์ ๊ธฐํผํ๋ผ. ์ด๋ โ๋ฌด์์ด ๊ณต์ ๋๊ณ ์๋๊ณ โ์ ๋ํ ๊น์ ์ดํด๋ฅผ ์๊ตฌํ๋ค. ๊ณต์ ๊ฐ์ฒด์ ๊ฐฏ์์ ๊ณต์ ์์ญ์ ์ต์ํ์ผ๋ก ์ค์ฌ๋ผ. ํด๋ผ์ด์ธํธ๊ฐ ๊ณต์ ๊ฐ์ฒด์ ์ํ(์ ๊ธ ๋ฑ)๋ฅผ ๊ด๋ฆฌํ๋ ๋์ ๊ณต์ ๊ฐ์ฒด์ ๋์์ธ์ ๋ณ๊ฒฝํ๋ผ.
๋ฌธ์ ๋ ๋์ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ ์ง ์์ ๋ฌธ์ ๋ค์ ๋ณดํต โํ๋ฒ๋ง ๋ฐ์ํ๋โ ๋ฌธ์ ๋ก ์น๋ถ๋๋ค. ์ด๋ฌํ one-off๋ค์ ๋ณดํต ์์คํ ์ ๋ถํ๊ฐ ๊ฑธ๋ฆฐ ๊ฒฝ์ฐ, ํน์ ๋ฌด์์๋ก ๋ฐ์ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ค๋ ๋ ๊ด๋ จ ์ฝ๋๋ ์ฌ๋ฌ ์ค์ , ํ๊ฒฝ์์ ๋ฐ๋ณต์ ์ด๊ณ ์ง์์ ์ผ๋ก ์ํํด ๋ณด๋ผ. ๋น์ ์ ์ฝ๋๋ฅผ ์๊ฐ์ ๋ค์ฌ instrumentํ๊ฒ ๋๋ฉด ๋ฌธ์ ์ ์ ์ฐพ์ ํ๋ฅ ์ ๋์์ง ๊ฒ์ด๋ค. ์ง์ ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์๊ณ ์๋ํ ํด์ ์ฌ์ฉํ ์๋ ์๋ค. ์ถ์ํ๊ธฐ ์ ๊น์ง ์ต๋ํ ์ค๋ ํ ์คํธ ํด์ผํ ๊ฒ์ด๋ค Cleanํ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ค๋ฉด, ์ ๋๋ก ๋ ์ฝ๋๋ฅผ ๋ง๋ค์ด๋ผ ๊ฐ๋ฅ์ฑ์ ๊ธ๊ฒฉํ ์ฌ๋ผ๊ฐ ๊ฒ์ด๋ค.