์ฌ์ง์ ์ ๊ธ
์กฐ๊ฑด - ์ ๊ธ์ ์กฐ๊ฑด์ ์ ์ฉํ๋ฉด ์คํธ๋ฆผ์ ๋ํ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ์ ๊ธ ์กฐ๊ฑด์ java.util.concurrent.locks์ Condition ์ธํฐํ์ด์ค ๊ฐ์ฒด์ ๋๋ค. Condition ๊ฐ์ฒด๋ฅผ์ด์ ์ฃผ์ ์ค ํ๋์์ ๋ ผ์๋ Object ํด๋์คwait/notify/notifyAll์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ฌ๋ฌ ๋ฉด์์ ์ ์ฌํฉ๋๋ค
์ ๊ธ์ ๋๊ธฐํ์ ๋น๊ตํ์ฌ ๋ฆฌ์์ค/๋ธ๋ก์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ํํ๋ ์ ์ฐํ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋์ ๊ธ ํ๋ ์์ํฌ์ ์ธํฐํ์ด์ค์ ๋๋ค์ฌ๋ฌ ์ ๊ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๊ธ ํด์ ์์๋ ์์์ ์ผ ์ ์์ผ๋ฉฐ ๊ตฌ์ฑํ ์๋ ์์ต๋๋ค. ์ ๊ธ์ด ์ด๋ฏธ ์บก์ฒ๋ ์ํฉ์ ์ฒ๋ฆฌํ ๊ฐ๋ฅ์ฑ๋ ์์ต๋๋ค.
ReentrantLock์ ReentrantLock ํด๋์ค์ธ Lock ์ธํฐํ์ด์ค ์ ๊ตฌํ ์ค ํ๋์ ๋๋ค. ๋์ผํ ์ค๋ ๋๊ฐ ์ ๊ธ์ ํด์ ํ์ง ์๊ณ ์ด์ ์ ํธ์ถํ ๊ฒฝ์ฐ์๋ ์ ๊ธ ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
ReentrantLock ํด๋์ค์๋ Lock ์ธํฐํ์ด์ค ์ ๋ฉ์๋ ์ธ์๋ ํฉํ ๋ฆฌ ๋ฉ์๋ newCondition() ์ด ์์ต๋๋ค . ์ด ๋ฉ์๋๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.์ํ, ์ฃผ์ด์ง ๊ฐ์ฒด์ ๋๊ธฐ ์ธํธ์ ํ์ฌ ์ค๋ ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.์ํ.
private final Lock R_LOCK = ReentrantLock();
R_LOCK.lock();
try {
//some action happens here
} finally {
R_LOCK.unlock();
}
ReadWriteLock ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ๊ธ์ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค์ ๋๋ค. ์ ๊ธ์ ์์คํ ์ ์ฝ๊ธฐ๊ฐ ๋ง๊ณ ์ฐ๊ธฐ๊ฐ ๊ฑฐ์ ์์ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
ReentrantReadWriteLock - ๋ค์ค ์ค๋ ๋ ์๋น์ค ๋ฐ ์บ์์ ์ฌ์ฉ๋๋ฉฐ ๋๊ธฐํ๋ ๋ธ๋ก์ ๋นํด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค. ์ค์ ๋ก ์ด ํด๋์ค๋ 2๊ฐ์ ์ํธ ๋ฐฐํ์ ์ธ ๋ชจ๋๋ก ์๋ํฉ๋๋ค. ๋ง์ ํ๋ ๊ธฐ๊ฐ ๋ณ๋ ฌ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ 1๋ช ์ ์์ฑ์๋ง ๋ฐ์ดํฐ๋ฅผ ์ธ ๋์ ๋๋ค.
ReentrantReadWriteLock.ReadLock - readWriteLock.readLock()์ ํตํด ์ป์ ํ๋ ๊ธฐ์ ๋ํ ์ฝ๊ธฐ ์ ๊ธ์ ๋๋ค.
ReentrantReadWriteLock.WriteLock - readWriteLock.writeLock()์ ํตํด ์ป์ ์์ฑ์์ ๋ํ ์ฐ๊ธฐ ์ ๊ธ์ ๋๋ค.
๋๊ธฐ ์ฅ์น
AbstractOwnableSynchronizer๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ ๊ตฌ์ถ์ ๋ด๋นํ๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ๋ฐ์ดํฐ์์ ์๋ํ ์ ์๋ ์ ์ฉ ์คํธ๋ฆผ์ ๊ธฐ์ตํ๊ณ ์ฝ๊ธฐ ์ํ getter/setter๋ฅผ ํฌํจํฉ๋๋ค.
AbstractQueuedSynchronizer๋ FutureTask, CountDownLatch, Semaphore, ReentrantLock, ReentrantReadWriteLock์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ๋ํ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค. ๋จ์ผ ๋ฐ ์์ int ๊ฐ์ ์์กดํ๋ ์๋ก์ด ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์์ฑํ ๋๋ ์ฌ์ฉ๋ฉ๋๋ค.
AbstractQueuedLongSynchronizer๋ Atomic Long ๊ฐ์ ์ง์ํ๋ AbstractQueuedSynchronizer ์ ๋ณํ์ ๋๋ค
GO TO FULL VERSION