์ค๋ ๋๋ ์ฌ๋ฌ ํ๋์ ๋์์ ์ํํ ์ ์๊ฒ ํด์ค๋ค. ํ์ง๋ง ๋์์ฑํ๋ก๊ทธ๋๋ฐ์ ์ด๋ ต๊ณ ์๋ชป๋ ์ ์๋ ์ผ์ด ๋์ด๋๋ฉฐ ๋ฌธ์ ๋ฅผ ์ฌํํ๊ธฐ๋ ์ด๋ ต๋ค (๋๋ฒ๊น ์ด ์ด๋ ต๋ค)
ํ์ง๋ง, ์ด๋ ต๋ค๊ณ ํผํด์๋ ์๋๋ค. ์ค๋๋ ๋๋ฆฌ ์ฐ์ด๋ ๋ค์ค์ฝ์ด ํ๋ก์ธ์์ ํ์ ์ ๋๋ก ํ์ฉํ๋ ค๋ฉด ๋ฐ๋์ ๋ด๊ฒ์ผ๋ก ๋ง๋ค์ด์ผ๋ง ํ๋ ๊ธฐ์ ์ด๋ค.
์์ดํ 78 : ๊ณต์ ์ค์ธ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ ๋๊ธฐํํด ์ฌ์ฉํ๋ผ
๋๊ธฐํ์ ๊ธฐ๋ฅ
- ๋ฐฐํ์ ์คํ
๋ง์ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋๊ธฐํ๋ฅผ ๋ฐฐํ์ ์คํ, ์ฆ ํ ์ค๋ ๋๊ฐ ๋ณ๊ฒฝํ๋ ์ค์ด๋ผ์ ์ํ๊ฐ ์ผ๊ด๋์ง ์์ ์๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ณด์ง ๋ชปํ๊ฒ ๋ง๋ ์ฉ๋๋ก๋ง ์๊ฐํ๋ค.
์ผ๊ด๋ ๊ฐ์ฒด ์์ฑ → ์ ๊ทผํ๋ ๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ๋ฝ์ ๊ฒ → ๋ฝ์ ๊ฑด ๋ฉ์๋๊ฐ ๊ฐ์ฒด์ ์ํ๋ฅผ ํ์ธํ๊ณ ์์ ํจ ⇒ ๊ฐ์ฒด๋ฅผ ํ๋์ ์ผ๊ด๋ ์ํ์์ ๋ค๋ฅธ ์ผ๊ด๋ ์ํ๋ก ๋ณํ์ํค๋ ๊ณผ์
๋๊ธฐํ๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์ด๋ค ๋ฉ์๋๋ ์ด ๊ฐ์ฒด์ ์ํ๊ฐ ์ผ๊ด๋์ง ์์ ์๊ฐ์ ๋ณผ ์ ์๋ค.
๋๊ธฐํ์ ๋ ๋ค๋ฅธ ์ค์ํ ๊ธฐ๋ฅ! → ๋๊ธฐํ๋ ์ค๋ ๋ ์ฌ์ด์ ์์ ์ ์ธ ํต์ ์ ๊ผญ ํ์ํ๋ค.
- ์ค๋ ๋ ์ฌ์ด์ ์์ ์ ์ธ ํต์
๊ณต์ ์ค์ธ ๊ฐ๋ณ ๋ฐ์ดํฐ๊ฐ ์์์ (long, double..)์ผ๋ก ์ฝ๊ณ ์ธ ์ ์ฝ์์ง๋ผ๋ ๋๊ธฐํ์ ์คํจํ๋ฉด ์ฒ์ฐธํ ๊ฒฐ๊ณผ๋ก ์ด์ด์ง๋ค.
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested) // ํน์ ๊ฐ์๋จธ์ ์ด ์ต์ ํ ์ํํ๋ฉด ๋ฌดํํ ์คํ๋จ. ์ค๋ ๋๊ฐ ํต์ ๋ถ๊ฐ๋ฅ
i++;
})
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
์ ์ฝ๋๋ ๋ฉ์ธ์ฐ๋ ๋๊ฐ ๊ณต์ ๋ณ์๋ฅผ true๋ก ๋ฐ๊พธ๋ฉด 1์ด์์ ๋ฐฑ๊ทธ๋ผ์ด๋์ค๋ ๋๊ฐ ์ข ๋ฃ๋๊ธธ ๊ธฐ๋ํ์ง๋ง ์ค์ ๋ก๋ ๊ณ์ํด์ ๋์๊ฐ๋ค.
๊ทธ ์์ธ์ ๋๊ธฐํ์ด๋ค. ๋๊ธฐํํ์ง์์ผ๋ฉด ๋ฉ์ธ ์ค๋ ๋๊ฐ ์์ ํ ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋๊ฐ ์ด๋ ์์ ์ ๋ณด๊ฒ ๋ ์ง ๋ณด์ฅํ ์ ์๋ค. ๋ํ ์ต์ ํ๊ฐ ์งํ๋์ด ์์๊ณผ ๋ค๋ฅธ ํ๋ฆ์ผ๋ก ์ด์ด์ง ์ ์๋ค.
- ์ต์ ํ๋ก ํ๋ฆ์ด ๋ฌ๋ผ์ง ์ฝ๋
// ์๋ ์ฝ๋
while (!stopRequested)
i++;
// ์ต์ ํ ์ฝ๋
if (!stopRequuested)
while(true)
i++;
์ต์ ํ๋ก ์ธํด ๊ณต์ ๋ณ์ ๊ฐ์ด ๋ฐ๊ปด๋ ์ค์ง๋์ง ์๊ณ ์คํ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ฐ๊ธฐ ๋ฉ์๋์ ์ฝ๊ธฐ ๋ฉ์๋ ๋ชจ๋๋ฅผ ๋๊ธฐํํด์ผ๋ง ํ๋ค.
→ ์ฐ๊ธฐ์ ์ฝ๊ธฐ ๋ชจ๋๊ฐ ๋๊ธฐํ๋์ง ์์ผ๋ฉด ๋์์ ๋ณด์ฅํ์ง ์๋๋ค.
private static synchronized void requestStop() {
stopRequested = true;
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
public static void main(String[] args) {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested())
i++;
})
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
์ ์ฝ๋๋ ๋๊ธฐํ์ ๊ธฐ๋ฅ ์ค ์ค๋ ๋ ๊ฐ ํต์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋์๋ค.
volatile
์ ์ฝ๋์์ ๊ณต์ ๋ณ์๋ฅผ volatile ๋ก ์ ์ธํ๋ฉด ๋๊ธฐํ๋ฅผ ์๋ตํ ์ ์๋ค. ๋ฐฐํ์ ์ํ๊ณผ๋ ์๊ด ์์ผ๋, ํญ์ ๊ฐ์ฅ ์ต๊ทผ์ ๊ธฐ๋ก๋ ๊ฐ์ ์ฝ๊ฒ ๋จ์ ๋ณด์ฅํ๋ค.
- ๋ฐฐํ์ ์คํ์ ๋ณด์ฅํ์ง ์์ผ๋ ์ค๋ ๋๊ฐ ํต์ ์ ์ง์ํ๋ ๊ฒ
์ฆ๊ฐ์ฐ์ฐ์
์ฆ๊ฐ์ฐ์ฐ์๋ atomicํ์ง ์๋ค. ์ด ์ฐ์ฐ์๋ ์ค์ ๋ก ํ๋์ ์ ๊ทผํด 1)๊ฐ์ ์ฝ๊ณ ๊ฐ์ ์ฆ๊ฐ์์ผ 2)์๋ก์ด ๊ฐ์ ์ ์ฅํ๋ค.
์ด ๋ ์ ๊ทผ ์ฌ์ด์ ๋ค์ด์ ๊ฐ์ ์ฝ์ด๊ฐ๋ฉด ํ๋ก๊ทธ๋จ์ด ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํด๋ด๋ ‘์์ ์คํจ'๊ฐ ๋ฐ์ํ๋ค.
์ด๋ ์ฆ๊ฐ์ฐ์ฐ์๊ฐ ํฌํจ๋์ด ์๋ ๋ฉ์๋์ synchronized ํ์ ์๋ฅผ ๋ถ์ด๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค. (๋์ ๋ณ์์ volatile์ ์ญ์ )
AtomicLong
AtomicLong์ ๋ฝ ์์ด๋ ์ค๋ ๋ ์์ ํ ๋ฉ์๋๋ฅผ ์ง์ํ๋ค
- ๋ฐฐํ์ ์คํ(์์์ฑ)๋ ๋ณด์ฅํ๊ณ , ์ค๋ ๋๊ฐ ํต์ ๋ ๋ณด์ฅํ๋ค.
์์๋ก๋ getAndIncrement() ๋ฉ์๋๊ฐ ์๋ค. (์์ ํ ์ฆ๊ฐ์ฐ์ฐ)
๋์์ฑ ๋ฌธ์ ๋ฅผ ํผํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ ์ด์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์๋ ๊ฒ์ด๋ค. (๋ถ๋ณ ๋ฐ์ดํฐ๋ง ๊ณต์ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค) ⇒ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ ๋จ์ผ ์ค๋ ๋์์๋ง ์ฐ๋๋ก ํ์.
-ํต์ฌ ์ ๋ฆฌ- : ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋์ ๋ชจ๋๋ฅผ ๋ฐ๋์ ๋๊ธฐํ ํด์ผํ๋ค.
์์ดํ 79 : ๊ณผ๋ํ ๋๊ธฐํ๋ ํผํ๋ผ
๊ณผ๋ํ ๋๊ธฐํ๋ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๊ณ , ๊ต์ฐฉ์ํ์ ๋น ๋จ๋ฆฌ๋ฉฐ, ์์ธกํ ์ ์๋ ๋์์ ์ผ๊ธฐํ๋ค.
- ์๋ต ๋ถ๊ฐ์ ์์ ์คํจ๋ฅผ(๋์์ฑ ๋ฌธ์ ) ํผํ๋ ค๋ฉด ๋๊ธฐํ ๋ฉ์๋๋ ๋๊ธฐํ ๋ธ๋ก ์์์๋ ์ ์ด๋ฅผ ์ ๋๋ก ํด๋ผ์ด์ธํธ์ ์๋ํ๋ฉด ์๋๋ค.
- ์ค๋ฒ๋ผ์ด๋ฉ ๊ฐ๋ฅํ ๋ฉ์๋๋ ํธ์ถํ๋ฉด ์๋๋ค
- ํด๋ผ์ด์ธํธ๊ฐ ๋๊ฒจ์ค ํจ์ ๊ฐ์ฒด๋ฅผ ํธ์ถํ๋ฉด ์๋๋ค.
- ๋๊ธฐํ ์์ญ์์๋ ๊ฐ๋ฅํ ์ผ์ ์ ๊ฒ ํ๋ ๊ฒ์ด ์ข๋ค.
- ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด๋ผ๋ฉด ๋๊ธฐํ ์์ญ ๋ฐ์ผ๋ก ์ฎ๊ฒจ๋ณด์.
- ๋๊ธฐํ๊ฐ ๊ธธ์ด์ง์๋ก ๋ณ๋ ฌ๋ก ์คํํ ๊ธฐํ๋ฅผ ์ฝ๊ณ ์ฝ๋ ์ต์ ํ ๊ธฐํ๋ ์๊ฒ ๋๋ค.
- ๊ฐ๋ณ ํด๋์ค๋ฅผ ์์ฑํ๋ ค๊ฑฐ๋ ๋ค์ ๋ ์ ํ์ง ์ค ํ๋๋ฅผ ๋ฐ๋ฅด์.
- ๋๊ธฐํ๋ฅผ ํ์ง ๋ง๊ณ , ํด๋น ํด๋์ค๋ฅผ ๋์์ ์ฌ์ฉํด์ผ ํ๋ ํด๋์ค๊ฐ ์ธ๋ถ์์ ์์์ ๋๊ธฐํํ๊ฒ ํ์ (StringBuilder)
- ๋๊ธฐํ๋ฅผ ๋ด๋ถ์์ ์ํํด ์ค๋ ๋ ์์ ํ ํด๋์ค๋ก ๋ง๋ค์. (StringBuffer)
์ ํํ๊ธฐ ์ด๋ ต๋ค๋ฉด ๋๊ธฐํ ํ์ง๋ง๊ณ ๋ฌธ์์ ‘์ค๋ ๋ ์์ ํ์ง ์๋ค'๊ณ ๋ช ๊ธฐํ์.
์์ดํ 80 : ์ค๋ ๋๋ณด๋ค๋ ์คํ์, ํ์คํฌ, ์คํธ๋ฆผ์ ์ ์ฉํ๋ผ
์คํ์(Excutor)๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํ๋ฅผ ๊ฐ๋จํ๊ฒ ์์ฑํ๊ณ ์ค๋ ๋ ํ์ ์์ฑํด ์ฌ๋ฌ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์ฝ๊ฒ ํ ์ ์๋๋ก ํด์ค๋ค.
- Task๋ ์์
๋จ์๋ฅผ ๋ํ๋ด๋ ํต์ฌ ์ถ์ ๊ฐ๋
- Runnable (์คํ)
- Callable (๊ฐ์ ๋ฐํ, ์์ธ๋ฅผ ๋์ง ์ ์์)
์์ ํ๋ฅผ ์์ ๋ง๋๋ ์ผ์ ์ผ๊ฐ์ผํ๊ณ , ์ค๋ ๋๋ฅผ ์ง์ ๋ค๋ฃจ๋ ๊ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ์ผ๊ฐ์ผํ๋ค. ๋ฐ๋ฉด ์คํ์ ํ๋ ์์ํฌ์์๋ ์์ ๋จ์์ ์คํ ๋งค์ปค๋์ฆ์ด ๋ถ๋ฆฌ๋๋ค.
์์ดํ 81 : wait์ notify๋ณด๋ค๋ ๋์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ์ฉํ๋ผ
wait์ notify๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ๊ฐ ์์ฃผ ๊น๋ค๋ก์ฐ๋ ๊ณ ์์ค ๋์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์.
java.util.concurrent์ ๊ณ ์์ค ์ ํธ๋ฆฌํฐ
- ์คํ์ ํ๋ ์์ํฌ
- ๋์์ฑ ์ปฌ๋ ์
- List, Queue, Map ๊ฐ์ ํ์ค ์ปฌ๋ ์
์ธํฐํ์ด์ค์ ๋์์ฑ์ ๊ฐ๋ฏธํด ๊ตฌํํ ๊ณ ์ฑ๋ฅ ์ปฌ๋ ์
- ๋์ ๋์์ฑ์ ์ํด ๋๊ธฐํ๋ฅผ ๋ด๋ถ์์ ์ํ (๋์์ฑ ๋ฌด๋ ฅํ ๋ถ๊ฐ, ์ธ๋ถ์ ๋ฝ์ ๋ ๋๋ ค์ง)
- ConcurrentHashMap์ synchronizedMap๋ณด๋ค ํจ์ฌ ์ข๋ค.
- ๋์์ฑ ๋งต์ ๋๊ธฐํ๋ ๋งต์ ๋นํด ์ฑ๋ฅ์ด ํจ์ฌ ์ข๋ค.
- List, Queue, Map ๊ฐ์ ํ์ค ์ปฌ๋ ์
์ธํฐํ์ด์ค์ ๋์์ฑ์ ๊ฐ๋ฏธํด ๊ตฌํํ ๊ณ ์ฑ๋ฅ ์ปฌ๋ ์
- ๋๊ธฐํ ์ฅ์น (synchronizer)
- ์๊ฐ ๊ฐ๊ฒฉ์ ์ด ๋๋ ํญ์ System.currentTimeMillis๊ฐ ์๋ System.nanoTime์ ์ฌ์ฉํ์
- wait๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฐ๋์ wait loop ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ผ. ๋ฐ๋ณต๋ฌธ ๋ฐ์์๋ ์ ๋๋ก ํธ์ถํ์ง ๋ง์
wait์ notify๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๊ฑด ๋์์ฑ ‘์ด์ ๋ธ๋ฆฌ ์ธ์ด'๋ก ํ๋ก๊ทธ๋๋ฐ ํ๋ ๊ฒ์ ๋น์ ํ ์ ์๋ค. ๋ฐ๋ฉด java.util.concurrent๋ ๊ณ ์์ค ์ธ์ด์ ๋น์ ํ ์ ์๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ์๋ก ์์ฑํ๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์ ํ ์๋ ๊ฒ์ด๋ค.
์์ดํ 82 : ์ค๋ ๋ ์์ ์ฑ ์์ค์ ๋ฌธ์ํํ๋ผ
๋ฉ์๋ ์ ์ธ์ synchronized ํ์ ์๋ฅผ ์ ์ธํ ์ง๋ ๊ตฌํ ์ด์์ผ ๋ฟ API์ ์ํ์ง ์๋๋ค. ์ฆ, ์ด๊ฒ๋ง์ผ๋ก๋ ์ค๋ ๋ ์์ ํ๋ค๊ณ ํ์ ํ๊ธฐ ์ด๋ ต๋ค.
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ API๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ํด๋์ค๊ฐ ์ง์ํ๋ ์ค๋ ๋ ์์ ์ฑ ์์ค์ ์ ํํ ๋ช
์ํด์ผ ํ๋ค.
- ๋ถ๋ณ(immutable) : ํด๋์ค์ ์ธ์คํด์ค๋ ์์์ ๊ฐ์์ ์ธ๋ถ ๋๊ธฐํ๋ ํ์ ์๋ค.
- ๋ฌด์กฐ๊ฑด์ ์ค๋ ๋ ์์ (unconditionally thread-safe) : ํด๋์ค์ ์ธ์คํด์ค๋ ์์ ๋ ์ ์์ผ๋, ๋ณ๋์ ์ธ๋ถ ๋๊ธฐํ ์์ด ๋์ ์ฌ์ฉํด๋ ์์ ํ๋ค
- ์กฐ๊ฑด๋ถ ์ค๋ ๋ ์์ (conditionally thread-safe) : ๋ฌด์กฐ๊ฑด์ ์ค๋ ๋ ์์ ๊ณผ ๊ฐ์ผ๋, ์ผ๋ถ ๋ฉ์๋๋ ๋์์ ์ฌ์ฉํ๋ ค๋ฉด ์ธ๋ถ ๋๊ธฐํ๊ฐ ํ์ํ๋ค.
- ์ค๋ ๋ ์์ ํ์ง ์์(not thread-safe) : ํด๋์ค ์ธ์คํด์ค๋ ์์ ๋ ์ ์๋ค. ๋์ ์ฌ์ฉํ๋ ค๋ฉด ๋ฉ์๋ ํธ์ถ์ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ธฐํํด์ผ ํ๋ค.
- ์ค๋ ๋ ์ ๋์ (thread-hostile) : ๋ชจ๋ ๋ฉ์๋ ํธ์ถ์ ์ธ๋ถ ๋๊ธฐํํ๋๋ผ๋ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์์ ํ์ง ์๋ค.
์ ํํ ์ธ์ด๋ก ์ค๋ช ํ๊ฑฐ๋ ์ค๋ ๋ ์์ ์ฑ ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ ์ ์๋ค.
ํด๋์ค์ ์ค๋ ๋ ์์ ์ฑ์ ๋ณดํต ํด๋์ค์ ๋ฌธ์ํ ์ฃผ์์ ๊ธฐ์ฌํ๋ค. ๋ ํนํ ํน์ฑ์ ๊ฐ์ง ๋ฉ์๋๋ผ๋ฉด ํด๋น ๋ฉ์๋์ ์ฃผ์์ ๊ธฐ์ฌํ๋๋ก ํ๋ค.
์์ดํ 83 : ์ง์ฐ ์ด๊ธฐํ๋ ์ ์คํ ์ฌ์ฉํ๋ผ
์ง์ฐ์ด๊ธฐํ๋ ํ๋์ ์ด๊ธฐํ ์์ ์ ๊ทธ๋ฐง์ด ์ฒ์ ํ์ํ ๋๊น์ง ๋ฆ์ถ๋ ๊ธฐ๋ฒ์ด๋ค. (์คํ๋ง ์ํ ์ฐธ์กฐ ํด๊ฒฐ ์ ์ฌ์ฉํ๋ ๊ธฐ์ต์ด ๋๋ค)
- ์ฃผ๋ก ์ต์ ํ ์ฉ๋์ ์ฌ์ฉํ๋ฉฐ ํด๋์ค์ ์ธ์คํด์ค ์ด๊ธฐํ ์ ๋ฐ์ํ๋ ์ํ ๋ฌธ์ ํด๊ฒฐ ์์๋ ์ฌ์ฉ
์ฑ๋ฅ์ ์ผ๋ก ์ง์ฐ์ด๊ธฐํ๊ฐ ์ข์ ๊ฒฝ์ฐ๋ ํด๋น ํด๋์ค์ ์ธ์คํด์ค ์ค ๊ทธ ํ๋๋ฅผ ์ฌ์ฉํ๋ ์ธ์คํด์ค๊ฐ ๋ฎ์ผ๋ฉด์ ๊ทธ ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋น์ฉ์ด ํฐ ๊ฒฝ์ฐ์ด๋ค.
ํ์ง๋ง, ์ด๋ฐ ๊ฒฝ์ฐ๊ฐ ์ ๊ณ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์ ์ ์ฉํ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์ํฉ์์ ์ผ๋ฐ์ ์ธ ์ด๊ธฐํ๊ฐ ์ง์ฐ ์ด๊ธฐํ๋ณด๋ค ๋ซ๋ค
- ์ง์ฐ์ด๊ธฐํ ๋ฐฉ๋ฒ
- ์ง์ฐ์ด๊ธฐํ๊ฐ ์ด๊ธฐํ ์ํ์ฑ์ ๊นจ๋จ๋ฆด ๊ฒ ๊ฐ์ผ๋ฉด synchronized ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ์
- ์ฑ๋ฅ ๋๋ฌธ์ ์ ์ ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํด์ผ ํ๋ค๋ฉด lazy initialization holder class ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ์
- ๋ฅ ๋๋ฌธ์ ์ธ์คํด์ค ํ๋๋ฅผ ์ง์ฐ ์ด๊ธฐํํด์ผ ํ๋ค๋ฉด double-check ๊ด์ฉ๊ตฌ๋ฅผ ์ฌ์ฉํ๋ผ
๋๋ถ๋ถ์ ์ง์ฐ ์ด๊ธฐํ๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ๊ผญ ํ์ํ๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ์ง์ฐ์ด๊ธฐํ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์.
์์ดํ 84 : ํ๋ก๊ทธ๋จ์ ๋์์ ์ค๋ ๋ ์ค์ผ์ค๋ฌ์ ๊ธฐ๋์ง ๋ง๋ผ
์ ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ์ค๋ ๋ ์ค์ผ์ค๋ฌ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์๋์ณ์๋ ์๋๋ค.
์ ํ์ฑ์ด๋ ์ฑ๋ฅ์ด ์ค๋ ๋ ์ค์ผ์ค๋ฌ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ๋ค๋ฅธ ํ๋ซํผ์ ์ด์ํ๊ธฐ ์ด๋ ต๋ค.
์ค๋ ๋ ์๊ฐ ์ง๋์น๊ฒ ๋ง๋ค๋ฉด ์ค์ผ์ค๋ฌ์ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ๊ฐ ๋์ด๋๊ณ ์ด๋ ์ ์ฑ ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ฌ๋ผ์ง๊ฒ ํ ์ ์๋ค. ์คํ ๊ฐ๋ฅํ ์ค๋ ๋ ์๋ฅผ ์ ๊ฒ ์ ์งํ๋ ๊ธฐ๋ฒ์ ๊ฐ ์ค๋ ๋๊ฐ ์์ ์ ์๋ฃํ ํ ๋ค์ ์ผ๊ฑฐ๋ฆฌ๊ฐ ์๊ธธ ๋๊น์ง ๋๊ธฐํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ค๋ ๋๋ ๋น์ฅ ์ฒ๋ฆฌํด์ผ ํ ์์ ์ด ์๋ค๋ฉด ์คํ๋ผ์๋ ์๋๋ค.
- ์ค๋ ๋ ํ ํฌ๊ธฐ๋ฅผ ์ ์ ํ ์ค์ ํ๊ณ ์์ ์ ์งง๊ฒ ์ ์งํ์
์ค๋ ๋๋ ์ ๋ ๋ฐ์ ๋๊ธฐ ์ํ๊ฐ ๋๋ฉด ์๋๋ค.
- ์ค๋ ๋ ์ค์ผ์ค๋ฌ์ ๋ณ๋์ ์ทจ์ฝํ๊ณ , ํ๋ก์ธ์์ ํฐ ๋ถ๋ด์ ์ค๋ค.
ํน์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋๋ค๊ณผ ๋น๊ตํด CPU ์๊ฐ์ ์ถฉ๋ถํ ์ป์ง ๋ชปํด์ ๊ฐ์ ํ ๋์ด๊ฐ๋ ํ๋ก๊ทธ๋จ์ ๋ณด๋๋ผ๋ Thread.yield๋ฅผ ์จ์ ๋ฌธ์ ๋ฅผ ๊ณ ์ณ๋ณด๋ ค๋ ์ ํน์ ๋จ์ณ๋ด์
- ํ ์คํธํ ์๋จ๋ ์๊ณ , ์ด์์ฑ๋ ๋ฎ๋ค.
'๐์ฝ์ ์ฑ ์ ๋ฆฌ > ์ดํํฐ๋ธ์๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] 12์ฅ : ์ง๋ ฌํ (0) | 2022.04.08 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] 10์ฅ : ์์ธ (0) | 2022.03.29 |
[์ดํํฐ๋ธ ์๋ฐ] 9์ฅ : ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์์น (0) | 2022.03.27 |
[์ดํํฐ๋ธ ์๋ฐ] 8์ฅ : ๋ฉ์๋ (1) | 2022.03.27 |
[์ดํํฐ๋ธ ์๋ฐ] 7์ฅ : ๋๋ค์ ์คํธ๋ฆผ (0) | 2022.03.23 |