๋ฉ์๋๋ ๋ธ๋ก์ ํ ์ค๋ ๋๊ฐ ์ํํ๋๋ก ๋ณด์ฅํ๋ ค๋ฉด synchronized ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ๋๊ธฐํ๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๋ฉด ์ด๋ค ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ํ๊ฐ ์ผ๊ด๋์ง ์์ ์๊ฐ์ ๋ณผ ์ ์๋ค. ๋๊ธฐํ๋ ๋ฉ์๋๋ ๋ธ๋ก์ ๋ค์ด๊ฐ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ฝ์ ๋ณดํธํ์ ์ํ๋ ๋ชจ๋ ์ด์ ์์ ์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ฒ ํ๋ค. ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋จ์ด๋ผ๋ฉด ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋์ง๋ง ๋ฉํฐ ์ค๋ ๋ ๊ธฐ๋ฐ์ด๋ผ๋ฉด ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ๋ ๋๊ธฐํ๋ฅผ ๊ณ ๋ฏผํด์ผ ํ๋ค.
- Synchronized ํค์๋๋ ๋ฉ์๋๋ ๋ธ๋ก์ ํ ๋ฒ์ ํ ์ค๋ ๋์ฉ ์ํํ๋๋ก ๋ณด์ฅํ๋ค.
- ๋๊ธฐํ์ ์ฃผ์ ๋ชฉ์ :
- ๋ฐฐํ์ ์คํ: ํ ์ค๋ ๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ผ๊ด๋์ง ์์ ์ํ์ ๊ฐ์ฒด๋ฅผ ๋ณด์ง ๋ชปํ๋๋ก ๋ง๋๋ค.
- ์ค๋ ๋ ๊ฐ ํต์ ๋ณด์ฅ: ํ ์ค๋ ๋๊ฐ ๋ง๋ ๋ณํ๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์์ ํ์ธ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
๋๊ธฐํ๋ ์๋ฐ ํ๋ก๊ทธ๋จ์์ ๋งค์ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ , ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ์์ ์ด๋ค. ๋๊ธฐํ๊ฐ ์๋ค๋ฉด, ํ๋ก๊ทธ๋จ์ด ์๋ํ์ง ์์ ๋์์ ์ํํ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๊ณ , ๋๋ฒ๊น ์ด ๊ทน๋๋ก ์ด๋ ค์์ง ์ ์๋ค. ์ค๋ ๋ ๊ฐ์ ํต์ ๊ณผ ์คํ ์์๊ฐ ๋ถํ์คํ ๋, ๋๊ธฐํ๋ ์์ ์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ๋ค.
ํนํ, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ ๋ถ์ผ์น์ ๊ฒฝ์ ์ํ๊ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ํ ์ ์๋ค. ์ด ๋ฌธ์ ๋ ๋๊ธฐํ๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฝ๋์ ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ค.
- long๊ณผ double์ ์ ์ธํ ๋ณ์์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ ๋์์ ์์์ ์ด๋ค.
- ์ฆ, ๋๊ธฐํ ์์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ์ ๋ณ์๋ฅผ ์์ ํ๋๋ผ๋ ํญ์ ์ด๋ค ์ค๋ ๋๊ฐ ์ ์์ ์ผ๋ก ์ ์ฅํ ๊ฐ์ ์ฝ์ด์ค๋ ๊ฒ์ ๋ณด์ฅํ๋ค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด๋ฌํ ์์์ฑ ๋ณด์ฅ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์๋ค. ํ ์ค๋ ๋์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ค๋ฅธ ์ค๋ ๋์์ ๊ด์ฐฐ๋ ์์ ์ ๋ณด์ฅ๋์ง ์๋๋ค.
ํ์ด์ ๋งํด๋ณด์๋ฉด, ํ์ง๋ง ์ค๋ ๋๊ฐ ํ๋๋ฅผ ์ฝ์ ๋ ํญ์ โ์์ ์ด ์์ ํ ๋ฐ์๋โ ๊ฐ์ ์ป๋๋ค ๋ณด์ฅํ์ง๋ง, ํ ์ค๋ ๋๊ฐ ์ ์ฅํ ๊ฐ์ด ๋ค๋ฅธ ์ค๋ ๋์๊ฒ โ๋ณด์ด๋๊ฐโ๋ ๋ณด์ฅํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ธ ๋๋ ๋๊ธฐํํด์ผ ํ๋ค.
์์: ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค๊ณ ํด์ ์ค๋ ๋ ๊ฐ์ ํต์ ์ด ๋ณด์ฅ๋์ง ์๋๋ค. ๋๊ธฐํ๋ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ๊ณต์ ํ๋๋ก ๋๋๋ค.
- ๋๊ธฐํ ์์ด ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ๊ฒฝ์ฐ ์น๋ช ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- Thread.stop() ๋ฉ์๋์ ์ฌ๋ก๋ฅผ ํตํด ์ด๋ฅผ ์ดํดํ ์ ์๋ค.
- Thread.stop() ๋ฉ์๋๋ ์์ ํ์ง ์์ ์ด๋ฏธ ์ฌ์ฉ ์์ (deprecated) API๋ก ์ง์ ๋์๋ค.
- ์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ๋ก ์์ ํ๋ฉฐ ์ค๋ ๋ ๊ฐ ์ผ๊ด์ฑ์ ๊นจํธ๋ฆด ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
๋ฐ๋ผ์, ์ค๋ ๋๋ฅผ ๋ฉ์ถ๋ ์์ ์กฐ์ฐจ๋ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋๊ธฐํ๋ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค. ๋๊ธฐํ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๊ณ , ์ค๋ ๋ ๊ฐ ํต์ ์ ์ ๋ขฐ์ฑ์ ํ๋ณดํด์ผ ํ๋ค.
๋๊ธฐํ๊ฐ ์๋ชป ๋์์ ๋๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ฝ๋๋ก ์ดํด๋ณด์. ์๋ ์ฝ๋๋ ์ผ๋ง๋ ์ค๋ซ๋์ ์คํ๋ ๊น?
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;
}
}- ๋ฌธ์ ์ :
- ์ค๋ ๋๊ฐ
start๋๊ณ 1์ด ๋์์ sleep์ด ๋๋๋ฉด boolean ๋ณ์์ ๊ฐ์ด true๊ฐ ๋์ด ๋ฃจํ๋ฅผ ๋น ์ ธ๋์ฌ ๊ฒ์ผ๋ก ์์๋๋ค. ํ์ง๋ง ์ค์ ๋ก ์ฝ๋๋ฅผ ์ํํด๋ณด๋ฉด ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ๋์ง ์๋๋ค. - ๋ฉ์ธ ์ค๋ ๋์์
stopRequested = true;๋ก ์ค์ ํด๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋๊ฐ ์ด๋ฅผ ์ธ์งํ์ง ๋ชปํ ์ ์๋ค. - ์ด๋ ๋๊ธฐํ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ๊ฐ์ ๋จธ์ ์ ์ต์ ํ๋ก ์ธํด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ค๋ ๋๊ฐ
์์ ์ต์ ํ:
// ์๋ ์ฝ๋
while (!stopRequested) i++;
// ์ต์ ํ๋ ์ฝ๋
if (!stopRequested) {
while (true) i++;
}- ์ด๋ JVM์ด ์ค์ ๋ก ์ ์ฉํ๋ ๋์ด์ฌ๋ฆฌ๊ธฐ(hoisting, ํธ์ด์คํ )๋ผ๋ ์ต์ ํ ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
- ์ด์ ๊ฐ์ ์ต์ ํ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์๋ต ๋ถ๊ฐ ์ํ(liveness failure)๊ฐ ๋์ด ์ข ๋ฃ๋์ง ์์ ์ ์๋ค.
.๋ค์ ๊ธฐ์กด ์ฝ๋๋ก ๋์์์ ์๊ฐํด๋ณด๋ฉด, ๊ณต์ ํ๋ ๋ณ์๋ฅผ ๋ค๋ฃฐ ๋ ๋๊ธฐํํ๋ ์ฝ๋๋ฅผ ๋ฃ์ผ๋ฉด ๋๋ค.
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();
}
}- ํด๊ฒฐ ๋ฐฉ๋ฒ:
requestStop๊ณผstopRequested๋ฅผ ๋ชจ๋ ๋๊ธฐํํ์ฌ ์ค๋ ๋ ๊ฐ์ ํต์ ์ ๋ณด์ฅ.- ์ด๋ ์ค๋ ๋๊ฐ ์๋ก์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฆ์ ๋ฐ์ํ ์ ์๋๋ก ํ๋ค.
๋๊ธฐํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ฉด ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ์ํ๋ฅผ ๋ช ํํ ์ ์ํ ์ ์์ผ๋ฉฐ, ๋์ ์์ธก์ด ๊ฐ๋ฅํด์ง๋ค. ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ๋๋ฒ๊น ํธ์์ฑ ๋ํ ์ฆ๊ฐํ๋ค.
์ด์ฒ๋ผ ๋๊ธฐํ๋ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ํด ๋ชจ๋ ํ์ํ๋ค. ์ ์ฝ๋์ฒ๋ผ ๊ณต์ ํ๋์ ๋ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ฉ์๋ ๋ชจ๋๋ฅผ ๋๊ธฐํ ์ฒ๋ฆฌํ๋ฉด ๋ฌธ์ ๋ ํด๊ฒฐ๋๋ค.
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++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}- volatile ํ์ ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ธฐํ ์์ด๋ ์ต์ ๊ฐ ๋ณด์ฅ. ์ด๋ก ์ ์ผ๋ก๋ CPU ์บ์๊ฐ ์๋ ์ปดํจํฐ์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๊ฐ์ ์ฝ์ด์จ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋๊ฐ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์์ ์ํ๋๋ค.
- volatile์ ์ค๋ ๋ ๊ฐ ํต์ ๋ณด์ฅ๋ง ์ํํ๋ฉฐ, ๋ฐฐํ์ ์คํ์ ์ ๊ณตํ์ง ์๋๋ค.
์ถ๊ฐ ์ค๋ช : volatile์ ์ ์ ํ ์ฌ์ฉ ์ ์ฑ๋ฅ๊ณผ ๊ฐ๊ฒฐ์ฑ์ ๋ชจ๋ ์ ๊ณตํ์ง๋ง, ๋ชจ๋ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋๋ค. ๋ฐฐํ์ ์คํ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ๋๊ธฐํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ ์ฝ๋์ฒ๋ผ volatile์ ์ฌ์ฉํ๋ฉด ๋๊ธฐํ๋ฅผ ์๋ตํด๋ ๋๋ค. ๋ค๋ง ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํ๋ค. ์๋์ ๊ฐ์ ์์ ์์ ๋ฌธ์ ์ ์ ์ฐพ์๋ณผ ์ ์๋ค.
private static volatile int nextSerialNumber = 0;
public static int generateSerialNumber() {
return nextSerialNumber++;
}- ๋ฌธ์ ์ :
- ์ฝ๋์์ผ๋ก ์ฆ๊ฐ ์ฐ์ฐ์(++)๋ ํ๋์ง๋ง ์ค์ ๋ก๋ volatile ํ๋์ ๋ ๋ฒ ์ ๊ทผํ๋ค. ๋จผ์ ๊ฐ์ ์ฝ๊ณ , ๊ทธ ๋ค์์ 1์ ์ฆ๊ฐํ ํ ์๋ก์ด ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ ๋ฒ์งธ ์ค๋ ๋๊ฐ ์ฒซ ๋ฒ์งธ ์ค๋ ๋์ ์ฐ์ฐ ์ฌ์ด์ ๋ค์ด์ ๊ณต์ ํ๋๋ฅผ ์ฝ๊ฒ ๋๋ฉด, ์ฒซ ๋ฒ์งธ ์ค๋ ๋์ ๊ฐ์ ๊ฐ์ ๋ณด๊ฒ๋ ๊ฒ์ด๋ค.
- ์ฆ๊ฐ ์ฐ์ฐ์(++)๋ ์์์ ์ด์ง ์์.
- ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์ฌ์ด์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ฐ์ ํ ๊ฐ๋ฅ์ฑ.
์ด๋ก ์ธํด ๋์ผํ ๊ฐ์ด ์ฌ๋ฌ ๋ฒ ๋ฐํ๋๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด์ฒ๋ผ ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํด๋ด๋ ์ค๋ฅ๋ฅผ ์์ ์คํจ(safety failure)๋ผ๊ณ ํ๋ค. ์ด ๋ฌธ์ ๋ ๋ฉ์๋์
synchronized๋ฅผ ๋ถ์ด๊ณvolatileํค์๋๋ฅผ ๊ณต์ ํ๋์์ ์ ๊ฑฐํ๋ฉด ํด๊ฒฐ๋๋ค.
private static final AtomicLong nextSerialNum = new AtomicLong();
public static long generateSerialNumber() {
return nextSerialNum.getAndIncrement();
}- java.util.concurrent.atomic ํจํค์ง์ AtomicLong์ ์ฌ์ฉ.
- ๋ฝ-ํ๋ฆฌ(lock-free) ๋ฐฉ์์ผ๋ก ์ค๋ ๋ ์์ ๊ตฌํ.
- ์ฑ๋ฅ ๋ฉด์์๋ ์ฐ์.
- AtomicLong์ ์ฅ์ : ๋ณ๋์ ๋ฝ(lock)์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก, ์ฑ๋ฅ์ด ์ค์ํ ํ๊ฒฝ์์ ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค.
volatile์ ๋๊ธฐํ์ ํจ๊ณผ ์ค ํต์ ์ชฝ๋ง ์ง์ํ์ง๋ง ์ด ํจํค์ง๋ ์์์ฑ(๋ฐฐํ์ ์คํ)๊น์ง ์ง์ํ๋ค. ๊ฒ๋ค๊ฐ ์ฑ๋ฅ๋ ๋๊ธฐํ ๋ฒ์ ๋ณด๋ค ์ฐ์ํ๋ค.
- synchronized์ AtomicLong:
synchronized๋ ๋ฐฐํ์ ์คํ๊ณผ ์ค๋ ๋ ๊ฐ ํต์ ์ ๋ชจ๋ ๋ณด์ฅํ์ง๋ง, ์ฑ๋ฅ์ด ์๋์ ์ผ๋ก ๋ฎ๋ค.AtomicLong์ ๊ฐ๋ฒผ์ด ๋ฝ-ํ๋ฆฌ ๋ฐฉ์์ผ๋ก, ๋์์ฑ ์์ ์์ ๋ ๋์ ์ฑ๋ฅ ์ ๊ณต.
๋ถ๊ฐ ์ค๋ช : synchronized๋ ์ฝ๋์ ๋์ ์์ ์ฑ์ ๋ณด์ฅํ์ง๋ง, ๋ง์ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํ ์ ์๋ค. ๋ฐ๋ฉด AtomicLong์ ์ด๋ฌํ ๋ณ๋ชฉ์ ์ต์ํํ๋ฉฐ ๋ ๋์ ์ฒ๋ฆฌ๋์ ์ ๊ณตํ๋ค.
- ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ: ๊ณต์ ์ค์ธ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ต์ํ.
- ๋ถ๋ณ ๋ฐ์ดํฐ(immutable)๋ง ๊ณต์ ํ๊ฑฐ๋, ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋จ์ผ ์ค๋ ๋์์๋ง ์ฌ์ฉ.
- ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ๋๋ ์์ ๋ฐํ ๊ธฐ๋ฒ ์ฌ์ฉ.
- ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์ค๋ ๋์ ์์ ํ๊ฒ ์ ๋ฌ.
- ์์ ๋ฐํ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ฉฐ, ์ค๋ ๋ ๊ฐ์ ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ค์ ์์น์ ์ ์ฅ:
- ์ ์ ํ๋
- volatile ํ๋
- final ํ๋
- ๋์์ฑ ์ปฌ๋ ์
- ๊ฐ ์ ์ฅ ์์น๋ ๋ฐ์ดํฐ์ ๊ฐ์์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค.
- java.util.concurrent ํจํค์ง์ ๋์์ฑ ์ปฌ๋ ์
์ฌ์ฉ:
ConcurrentHashMap,CopyOnWriteArrayList๋ฑ.- ๋ฝ ์์ด๋ ์ค๋ ๋ ์์ ์ฑ ์ ๊ณต.
์ฃผ์: ์ธ๋ถ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์๋ ์ ์ดํดํด์ผ ํ๋ค.
- ์๊ธฐ์น ์์ ์ค๋ ๋ ๊ฐ ์ถฉ๋์ ๋ฐฉ์งํ๋ ค๋ฉด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฌธ์๋ฅผ ๊ผผ๊ผผํ ํ์ธํด์ผ ํ๋ค.
- ์ฃผ์: ๋์์ฑ ์ปฌ๋ ์ ์ ์ฌ์ฉํ ๋์๋ ๋ฐ์ดํฐ์ ๋ ผ๋ฆฌ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ปฌ๋ ์ ์ ๊ฑธ์น ์์ ์ ๋ณ๋์ ๋๊ธฐํ๊ฐ ํ์ํ ์ ์๋ค.
์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๋์์ ๋ฐ๋์ ๋๊ธฐํ ํด์ผ ํ๋ค. Synchronized์ volatile์ ์๋ฐ์ ๋๊ธฐํ์์ ํ์์ ์ด๋ค.
- ๋๊ธฐํํ์ง ์์ผ๋ฉด ํ ์ค๋ ๋๊ฐ ์ํํ ๋ณ๊ฒฝ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ณด์ง ๋ชปํ ์ ๋ ์๋ค. ๊ณต์ ๋๋ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๋ ๋ฐ ์คํจํ๋ฉด ์๋ต ๋ถ๊ฐ ์ํ์ ๋น ์ง๊ฑฐ๋ ์์ ์คํจ๋ก ์ด์ด์ง ์ ์๋ค.
- ์ด๋ ๋๋ฒ๊น ๋์ด๋๊ฐ ๊ฐ์ฅ ๋์ ๋ฌธ์ ์ ์ํ๋ค. ๊ฐํ์ ์ด๊ฑฐ ๋ ํน์ ํ์ด๋ฐ์๋ง ๋ฐ์ํ ์๋ ์๊ณ , VM์ ๋ฐ๋ผ ํ์์ด ๋ฌ๋ผ์ง๊ธฐ๋ ํ๋ค. ๋ฐฐํ์ ์คํ์ ํ์ ์๊ณ ์ค๋ ๋๋ผ๋ฆฌ์ ํต์ ๋ง ํ์ํ๋ค๋ฉด volatile ํ์ ์๋ง์ผ๋ก ๋๊ธฐํํ ์ ์๋ค. ๋ค๋ง ์ฌ๋ฐ๋ก ์ฌ์ฉํ๊ธฐ๊ฐ ๊น๋ค๋กญ๋ค.
- ๊ฐ ๋๊ตฌ์ ์ญํ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ช ํํ ์ดํดํ๋ฉด, ๋ณด๋ค ์์ ํ๊ณ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ์ ์๋ค.\
์ฐธ๊ณ ๋ฐ ์ถ์ฒ
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
.png)
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)