Item 81. Concurrent Utilities
wait์ notify๋ณด๋ค๋ ๋์์ฑ ์ ํธ๋ฆฌํฐ๋ฅผ ์ ์ฉํ๋ผ
wait
์ notiy
๋ ๊ณ ์์ค์ ๋์์ฑ ์ ํธ๋ฆฌํฐ๊ฐ ์ง์ํ๊ธฐ ์์ ์ ์ ์์๋ฌ์ผ ํ์ง๋ง,
์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ๊น๋ค๋ก์ด ๊ธฐ๋ฅ์ผ๋ก, ๋์์ฑ ์ ํธ๋ฆฌํฐ๊ฐ ์ง์ํ๋ ํ ์์ ์์๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.(์ ํธ๋ฆฌํฐ ์ฌ์ฉ ๊ถ์ฅ)
java.util.concurrent
ํจํค์ง์์ ์ ๊ณตํ๋ ๊ณ ์์ค ์ ํธ๋ฆฌํฐ๋ ์ธ ๊ฐ์ง ๋ฒ์ฃผ๋ก ๋๋ ์ ์๋ค.
์คํ์ ํ๋ ์์ํฌ: ์์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๊ฒ ํด์ค๋ค.(
ExecutorService
์ธํฐํ์ด์ค์ThreadPoolExecutor
ํด๋์ค๋ฅผ ํฌํจํ ํ๋ ์์ํฌ)๋์์ฑ ์ปฌ๋ ์ : ๋์์ฑ์ ์ง์ํ๋ ์ปฌ๋ ์ ์ ์ ๊ณตํ๋ค.(
ConcurrentHashMap
,CopyOnWriteArrayList
๋ฑ)๋ด๋ถ์์ ๋๊ธฐํ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ ๋์์ฑ์ ๋ฌด๋ ฅํํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๊ณ , ์ธ๋ถ ๋ฝ์ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๋ค.
์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์์์ ์ผ๋ก ๋ฌถ์ด ํธ์ถํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋๋ฌธ์ ์ฌ๋ฌ ๊ธฐ๋ณธ ๋์์ ํ๋์ ๋์์ผ๋ก ๋ฌถ๋ ์ํ ์์กด์ ์์ ๋ฉ์๋๋ค์ด ์ถ๊ฐ๋ฌ์ด๋ค.(๋์์ฑ ์ปฌ๋ ์ ๋ฟ๋ง ์๋๋ผ ์ผ๋ฐ ์ปฌ๋ ์ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ)
๋๊ธฐํ ์ฅ์น: ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๊ฒ ํ์ฌ, ์์ ์ ์กฐ์จํ ์ ์๊ฒ ํด์ค๋ค.(
CountDownLatch
,Semaphore
,Phaser
๋ฑ)
๋๊ธฐํ ์ฅ์น๋ฅผ ์ฌ์ฉํ ์์
๋๊ธฐํ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ฉด, wait
, notify
๋ฅผ ์ด์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋จํ๊ฒ ๋์์ฑ์ ๋ค๋ฃฐ ์ ์๋ค.
์๋์ ์์๋ CountDownLatch
๋ฅผ ์ฌ์ฉํ์ฌ ๋์๋ค์ ๋์์ ์์ํด ๋ชจ๋ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํ๋ ๋ฉ์๋์ด๋ค.
์ฝ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
ready.countDown()
๋ก ์์ ์ ์ค๋ ๋๊ฐ ์ค๋น๋จ์ ์๋ฆผstart.await()
๋ก ๋ชจ๋ ์์ ์ ์ค๋ ๋๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผ(start.countDown()
์ ๋๊ธฐ)read.await()
๋ก ๋ชจ๋ ์์ ์ ์ค๋ ๋๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ฆผdone.countDown()
์ผ๋ก 2๋ฒ์์ ๋๊ธฐํ ์์ ์ ์ค๋ ๋๋ฅผ ๊นจ์done.await()
๋ก ๋ชจ๋ ์์ ์ ์ค๋ ๋๊ฐ ์์ ์ ์๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆผaction.run()
์ผ๋ก ์์ ์ ์ํdone.countDown()
์ผ๋ก ์์ ์ ์๋ฃํจ์ ์๋ฆผ๋ชจ๋ ์์ ์ด ์๋ฃ๋์ด
done.await()
๊ฐ ํ๋ฆฌ๋ฉดSystem.nanoTime() - startNanos
๋ฅผ ๋ฐํ
wait
์ notify
wait
์ notify
wait
์ notify
๋ ๊ณ ์์ค ๋์์ฑ์ ์ฌ์ฉํ ์ ์๋ ์ํฉ์์ ์ ํ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค.
๋ง์ฝ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ค๋ค์ผ ํ๋ค๋ฉด, ์๋์ ๊ท์น์ ๋ฐ๋ฅด๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋๋ ๊ฒ์ด ์ข๋ค.
wait
๋ ๋ฐ๋์ ๋๊ธฐ ๋ฐ๋ณต๋ฌธ(while
๋ฃจํ ์ฌ์ฉ) ์์์ ํธ์ถํด์ผ ํ๋ค.์ผ๋ฐ์ ์ผ๋ก
notify
๋ณด๋ค๋notifyAll
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
Last updated