๐ฏ ์์ดํ 78. ๊ณต์ ์ค์ธ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ ๋๊ธฐํํด ์ฌ์ฉํ๋ผ.
synchronized ํค์๋๋ ํด๋น ๋ฉ์๋๋ ๋ธ๋ก์ ํ๋ฒ์ ํ ์ค๋ ๋์ฉ ์ํํ๋๋ก ๋ณด์ฅํ๋ค. ํ ๊ฐ์ฒด๊ฐ ์ผ๊ด๋ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์์ฑ๋๊ณ , ์ด ๊ฐ์ฒด์ ์ ๊ทผํ๋ ๋ฉ์๋๋ ๊ทธ ๊ฐ์ฒด์ ๋ฝ(lock)์ ๊ฑด๋ค. ๋ฝ์ ๊ฑด ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ํ์ธํ๊ณ ํ์ํ๋ฉด ์์ ํ๋ค. ์ฆ, ๊ฐ์ฒด๋ฅผ ํ๋์ ์ผ๊ด๋ ์ํ์์ ๋ค๋ฅธ ์ผ๊ด๋ ์ํ๋ก ๋ณํ์ํจ๋ค.
๋๊ธฐํ ์์ด๋ ํ ์ค๋ ๋๊ฐ ๋ง๋ ๋ณํ๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์์ ํ์ธํ์ง ๋ชปํ ์ ์๋ค. ๋๊ธฐํ๋ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ํ๋ฅผ ๋ณผ ์ ์๊ฒ ํ๋ ๊ฒ์ ๋ฌผ๋ก , ๋๊ธฐํ๋ ๋ฉ์๋๋ ๋ธ๋ก์ ๋ค์ด๊ฐ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฝ์ ๋ณดํธํ์ ์ํ๋ ๋ชจ๋ ์ด์ ์์ ์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ ํด์ค๋ค.
๋๊ธฐํ๋ ๋ฐฐํ์ ์คํ๋ฟ ์๋๋ผ ์ค๋ ๋ ์ฌ์ด์ ์์ ์ ์ธ ํต์ ์ ๊ผญ ํ์ํ๋ค.
- ์๋ชป๋ ์ฝ๋ - ์ด ํ๋ก๊ทธ๋จ์ ์ผ๋ง๋ ์ค๋ ์คํ๋ ๊น?
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested){
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
- ์ ์ ํ ๋๊ธฐํํด ์ค๋ ๋๊ฐ ์ ์ ์ข ๋ฃํ๋ค.
public class StopThread {
private static boolean stopRequested;
private static synchronized void requestStop(){
stopRequested = true;
}
private static synchronized boolean stopRequested(){
return stopRequested;
}
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested()){
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
volatile
ํ๋๋ฅผ ์ฌ์ฉํด ์ค๋ ๋๊ฐ ์ ์ ์ข ๋ฃํ๋ค. volatile ํค์๋๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋ฉด ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ๋ณ์ ๊ฐ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
public class StopThread {
private static volatile boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(() -> {
int i = 0;
while (!stopRequested){
i++;
System.out.println(i);
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋์์ ๋ฐ๋์ ๋๊ธฐํ ํด์ผํ๋ค.
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=