์์ฑ
ยท
824
ยท
์์ ๋จ
0
์๋ ํ์ธ์!
์ฒซ๋ฒ์งธ ์ง๋ฌธ์ ์ฑ๊ธํค ํจํด์ ๊ตฌํํ๋ 7๊ฐ์ง ๋ฐฉ๋ฒ #2. LazyHolder, DCL, ENUM ๊ฐ์ ๋ด์ฉ์์
static์ ์ธ์คํด์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํด์ผ๋ก์ ๊ฐ ์ค๋ ๋๊ฐ ์์กด์ ์ด๋ค.
volatile์ ๊ฐ ์บ์๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํด์ผ๋ก์ ๊ฐ ์ค๋ ๋๊ฐ ์์กด์ ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด static์ volatile ํค์๋๊ฐ ์์ผ๋ฏ๋ก ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์๊ณ ๊ฐ ์บ์๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ธ์ง, ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ธ์คํด์ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ณต์ ๋ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋๋ฒ์งธ ์ง๋ฌธ์, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํด์ผ๋ก์ ๊ฐ ์ค๋ ๋๊ฐ ์์กด์ ์ด๊ฒ ํ๋ ๋์์ static๋ ๊ฐ๋ฅํ๋ฐ ์ volatile์ ์ฌ์ฉํ๋ ๊ฒ์ธ์ง, static๊ณผ volatile์ ์ฐจ์ด์ ์ ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค!
๋ต๋ณ 1
0
์๋ ํ์ธ์ ํก์ธ๋ใ ใ
static์ ์ธ์คํด์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํด
>> ์ด๋ป๊ฒ static์ผ๋ก ์ธ์คํด์ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํค๋๋ ๋ง์์ด์์ฃ ?
static์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ํด๋์ค๋ก๋๋น ํ๋์ ๋ณ์๋ฅผ ๊ณต์ ํฉ๋๋ค.
๊ทธ๋ฌ๋
๋์ผํ ํด๋์ค์ ํ ์ค๋ ๋์ ์ ๋ฐ์ดํธ๊ฐ ๋ค๋ฅธ ๋ชจ๋ ์ค๋ ๋์๊ฒ ๋ฐ๋ก ๋ฐ์๋์ง ์์ต๋๋ค. ์ด๋ ์บ์๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ๊ทธ๋ฆผ์ฒ๋ผ static์ผ๋ก ์ ์ธ๋ staticint๋ ๊ฐ๊ฐ์ ์ค๋ ๋๋ด์์ ๊ณต์ ๋๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค. ๊ทธ๋ฌ๋ volatile์ ๊ฐ๊ฐ์ ์ค๋๋ ์ธ์์๋ ๊ณต์ ๋๊ณ ์์์ ๋ณด์ฌ์ค๋๋ค.
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ์ํด์ผ๋ก์ ๊ฐ ์ค๋ ๋๊ฐ ์์กด์ ์ด๊ฒ ํ๋ ๋์์ static๋ ๊ฐ๋ฅํ๋ฐ ์ volatile์ ์ฌ์ฉํ๋ ๊ฒ์ธ์ง, static๊ณผ volatile์ ์ฐจ์ด์ ์ ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค!
>>
static์ ๊ฒฝ์ฐ 2๊ฐ ์ค๋ ๋(t1, t2)์์ ๊ฐ๊ฐ์ ์บ์๋ฉ๋ชจ๋ฆฌ์์ ๋์ผํ ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ด ์์ ํ๋ฏ๋ก t1์ ์ ๋ฐ์ดํธ๊ฐ t2์ ๋ฐ์๋์ง ์์ต๋๋ค.
public class Test {
static boolean flag = true;
public void test() {
new Thread(()->{
int cnt = 0;
while (flag) {
cnt++;
}
System.out.println("Thread1 finished\n");
}
).start();
new Thread(()-> {
try {
Thread.sleep(100);
} catch (InterruptedException ignored) {
}
System.out.println("flag to false");
flag = false;
}
).start();
}
public static void main(String[] args) {
new Test().test();
}
}
์ฆ ์์ ์ฝ๋๋ ๋ฌดํ๋ฃจํ์ ๊ฑธ๋ฆฝ๋๋ค.
volatile์ ๊ฐ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ง ์์ต๋๋ค.
๋ํ, ํก์ธ๋ ์ด์ฌํ ๊ณต๋ถํ์๋ ๊ฒ, ์ง๋ฌธํ์๋ ๊ฒ์ ์ ๋ง ์ข์ผ๋ ๊ฐ์ ๋ด์ฉ์ ๊ทธ๋๋ก ๋ธ๋ก๊ทธ์ ์จ๋์ผ์ จ๋๋ฐ... ๊ฐ์๋ด์ฉ์ ๋ธ๋ก๊ทธ์ ์ฐ๋ ๊ฒ์ ๊ธ์งํ๊ณ ์์ด์์. ๋น๊ณต๊ฐ ๋๋ ์ญ์ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์๋ ํ์ธ์ ํก์ธ๋ ใ ใ
๊ณต๊ฐ์ ์ผ๋ก ํฌ์คํ ์ ๋ถ๊ฐ๋ฅํ ๊ฒ ๊ฐ์ต๋๋ค.
๋น๊ณต๊ฐ ๋๋ ์ญ์ ๋ถํ๋๋ฆฝ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.
์์ธํ ์ค๋ช ๊ฐ์ฌํฉ๋๋ค!
์ฌ์ค ๊ทธ๋ฅ ๋ฉด์ ์์ ์ง๋ฌธ๋ฐ์ ๋ชฉ๋ก? ์ ๋์ ์ฉ๋๋ก ๋ธ๋ก๊ทธ์ ๊ณต๋ถ๋ด์ฉ์ ์ฌ๋ฆฌ๊ณ ์๋๋ฐ ๋ค๋ฅธ ๊ฐ์ฌ๋์ ๊ฐ์ ์๋ฃ๋ฅผ ์บก์ณํ์ฌ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๊ฐ๋ฅํ๋ค๊ณ ํ์ จ๊ฑฐ๋ ์... ๊ฐ์ ์ถ์ฒ๋ฅผ ๋งํฌ๋ก ๋ช ์ํ๊ณ ํฌ์คํ ํด๋ ์๋ ๊น์??ใ ใ