์žฌ์ง„์ž… ์ž ๊ธˆ

์กฐ๊ฑด - ์ž ๊ธˆ์— ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋ฉด ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž ๊ธˆ ์กฐ๊ฑด์€ 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 ์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค