
"์๋ , ์๋ฏธ๊ณ !"
"์๋ , ๊น!"
"์ค๋์ ๋์์ฑ์ ๋ํด ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค."
" ๋์์ฑ์ ๋ค์ค ์ค๋ ๋ ์์ ์ ์ต์ ํ๋ ํน์ ํด๋์ค๋ฅผ ํฌํจํ๋ Java ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋กญ๊ณ ๊ด๋ฒ์ํ ์ฃผ์ ์ ๋๋ค. ํ์ง๋ง ์ค๋์ ์๊ฐ๋ง ํ๊ฒ ์ต๋๋ค. ํจํค์ง ์ด๋ฆ์ java.util์ ๋๋ค. ๋์์ฑ ํจํค์ง์ ๋๋ค. ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ํด๋์ค์ ๋ํด ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค."
" ์์ ์ ํ. "
"count++๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ ์์ ์ด ์๋๋ผ๋ ๊ฒ์ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค. ๋ณ์๊ฐ 1์ฉ ์ฆ๊ฐํ๋ฉด ์ค์ ๋ก ์ธ ๊ฐ์ง ์์ ์ด ๋ฐ์ํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค."
"๊ทธ๋, Ellie๋ ์ผ๋ง ์ ์ ๋์๊ฒ ๋งํ๋ค."
์ค๋ ๋ 1 | ์ค๋ ๋ 2 | ๊ฒฐ๊ณผ |
---|---|---|
|
|
|
"์ ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Java๋ ์ด๋ฌํ ์์ ์ ํ๋๋ก, ์ฆ ์์์ ์ผ๋ก(์์๋ ๋๋ ์ ์์) ์ํํ๊ธฐ ์ํด ๋ฐ์ดํฐ ์ ํ์ ์ถ๊ฐํ์ต๋๋ค."
"์๋ฅผ ๋ค์ด Java์๋ AtomicInteger, AtomicBoolean, AtomicDouble ๋ฑ์ด ์์ต๋๋ค."
"<์นด์ดํฐ> ํด๋์ค๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค."
class Counter
{
private int c = 0;
public void increment()
{
c++;
}
public void decrement()
{
c--;
}
public int value()
{
return c;
}
}
"์ด ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฒ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?"
"์, ๋ชจ๋ ๋ฉ์๋๋ฅผ ๋๊ธฐํํ๊ณ ์๋ฃํ๊ฒ ์ต๋๋ค."
class synchronized Counter
{
private int c = 0;
public synchronized void increment()
{
c++;
}
public synchronized void decrement()
{
c--;
}
public synchronized int value()
{
return c;
}
}
"์ํ์ด. ํ์ง๋ง ์์ ์ ํ์ ์ฌ์ฉํ๋ฉด ์ด๋ค ๋ชจ์ต์ผ๊น?"
class AtomicCounter
{
private AtomicInteger c = new AtomicInteger(0);
public void increment()
{
c.incrementAndGet();
}
public void decrement()
{
c.decrementAndGet();
}
public int value()
{
return c.get();
}
}
"๊ทํ์ ํด๋์ค์ ๋ด ํด๋์ค๋ ๋ชจ๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง AtomicInteger๊ฐ ์๋ ํด๋์ค๊ฐ ๋ ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค."
"์, ์ฝ๊ฐ์ ์ฐจ์ด์ธ๊ฐ์?"
"์. ์ ๊ฒฝํ์ ๋น์ถ์ด ๋ณผ ๋ ์ ๋ ํญ์ ๋๊ธฐํ๋ก ์งํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๊ฐ ์์ฑ๋๊ณ ์ต์ ํ ํ๋ก์ธ์ค๊ฐ ์์๋ ํ์์ผ ์์ ์ ํ์ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ค์ ์์ฑํ๊ธฐ ์์ํด์ผ ํฉ๋๋ค. ํ์ง๋ง ์ด์จ๋ ๋๋ ๋น์ ์ ์ํ์ต๋๋ค. ๊ทธ๋ฌํ ์ ํ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ์๊ธฐ ์ํด์์ ๋๋ค. ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ด๋ฌํ ์ ํ์ด ์ฌ์ฉ๋๋ ์ฝ๋์ ๋ถ๋ชํ ๊ฐ๋ฅ์ฑ์ด ํญ์ ์์ต๋๋ค."
"๋์ํฉ๋๋ค. ๋ง์ด ๋ฉ๋๋ค."
"๊ทธ๋ฐ๋ฐ ์์ ์ ํ์ด ๋ถ๋ณ์ด ์๋๋ผ๋ ์ฌ์ค์ ์๊ณ ๊ณ์ จ์ต๋๊น? ํ์ค Integer ํด๋์ค ์ ๋ฌ๋ฆฌ AtomicInteger ์๋ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค."
"์๊ฒ ์ต๋๋ค. String ๋ฐ StringBuffer ์ ๊ฐ์ต๋๋ค ."
"์, ๊ทธ๋ฐ ๊ฒ์ ๋๋ค."
" ์ค๋ ๋๋ก๋ถํฐ ์์ ํ ์ปฌ๋ ์ . "
"์ด๋ฌํ ์ปฌ๋ ์ ์ ์๋ก ConcurrentHashMap์ ์ ์ํด๋ ๋ฉ๋๊น? HashMap์ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๊ฒ ๋ง๋ค๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น?"
"๋ชจ๋ ๋ฉ์๋๋ฅผ ๋๊ธฐํํ์๊ฒ ์ต๋๊น?"
"๋ฌผ๋ก ์ด์ฃ . ํ์ง๋ง ์ด์ ๊ทธ๋ฌํ SynchronizedHashMap์ด ํ๋ ์๊ณ ์ฌ๊ธฐ์ ์ก์ธ์คํ๋ ์์ญ ๊ฐ์ ์ค๋ ๋๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ๊ทธ๋ฆฌ๊ณ ์ด๋น 100๋ฒ์ฉ ์ ํญ๋ชฉ์ด ๋งต์ ์ถ๊ฐ๋๊ณ ๊ทธ ๊ณผ์ ์์ ์ ์ฒด ๊ฐ์ฒด๊ฐ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํด ์ ๊น๋๋ค."
"์, ์ด๊ฒ์ด ํ์ค ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋ฌด์์ ํ ์ ์์ต๋๊น?"
"Java์ ์ ์์๋ ๋ช ๊ฐ์ง ๋ฉ์ง ๊ฒ์ ์๊ฐํด ๋์ต๋๋ค."
"์ฐ์ ํ๋์ ๋ธ๋ก์ ConcurrentHashMap์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง '๋ฒํท'์ด๋ผ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ ConcurrentHashMap์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ์ ์ฒด ๊ฐ์ฒด๊ฐ ์๋ ์ก์ธ์ค๋๋ ๋ฒํท๋ง ์ ๊ธ๋๋ค. ๋ค๋ฅธ ์ฆ, ๋ง์ ์ค๋ ๋๊ฐ ๊ฐ์ฒด๋ฅผ ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค."
"๋ ๋ฒ์งธ๋ก, ๋ชฉ๋ก/์ง๋์ ์์๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ๋์์ ๋ชฉ๋ก์ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ์ด๋ฌํ ์ฝ๋๋ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค."
HashMap<String, Integer> map = new HashMap<String, Integer>();
for (String key: map.keySet())
{
if (map.get(key) == 0)
map.remove(key);
}
"ํ์ง๋ง ConcurrentHashMap์์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค."
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<String, Integer>();
for (String key: map.keySet())
{
if (map.get(key) == 0)
map.remove(key);
}
"๋์ ํจํค์ง์๋ ๋ง์ ์ด์ ์ด ์์ต๋๋ค. ์ด๋ฌํ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ฌํ ํด๋์ค๋ฅผ ์์ฃผ ์ ์ดํดํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค."
"๊ทธ๋ ๊ตฐ์. ๊ฐ์ฌํฉ๋๋ค. Kim. ์ ๋ง ํฅ๋ฏธ๋ก์ด ์์ ์ ๋๋ค. ์ธ์ ๊ฐ๋ ๊ฑฐ์ฅ์ฒ๋ผ ๋ง์คํฐํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค."
GO TO FULL VERSION