์ถ์ฒ
ChatGPT
1. ๋ฎคํ ์ค Mutex
Mutaul Exclusion์ ์ฝ์.
ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ๊ณต์ ์์์ ์ ๊ทผํ๋๋ก ๋ณด์ฅํ๋ค.
Lock Mechanism ์ ๊ธ ๋งค์ปค๋์ฆ
๋ฝ(lock)์ ์์์ ์ฌ์ฉํ ๋ ๋ค๋ฅธ ์ค๋ ๋์ ์ ๊ทผ์ ์ฐจ๋จํ๊ณ , ์์์ ์์ ๊ถ์ ๊ฐ๋ ๋ฐฉ์์ด๋ค. ๋ฎคํ ์ค๋ ์์์ ์ ๊ทธ๋(lock) ์ญํ ์ ํ๋ฉฐ, ๊ทธ ์์์ ๋ฎคํ ์ค๋ฅผ ์์ ํ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋ค.
Lock Mechanism์ ์๋ ๋ฐฉ์
- ์ค๋ ๋๋ ์์์ ์ ๊ทผํ ๋ ๋ฝ์ ํ๋ํ๋ค.
- ์์ ์ฌ์ฉ์ด ๋๋๋ฉด ๋ฝ์ ํด์ ํด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
ํน์ง
- ๋ฝ์ ์ฌ์ฉํ๋ ์ค๋ ๋๋ง ์์์ ์ฌ์ฉํ๊ณ , ๋ค๋ฅธ ์ค๋ ๋๋ ๋ฝ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐํด์ผ ํ๋ค.
- ๋ฎคํ ์ค๋ ๋จ์ผ ์ค๋ ๋์ ์ ๊ทผ๋ง์ ํ์ฉํด ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
๊ตฌํ
์๋ฐ์์๋ synchronized ํค์๋๋ ReentrantLock ํด๋์ค๋ฅผ ์ด์ฉํด ๋ฎคํ ์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
1. synchronized
ํน์ ์ฝ๋ ๋ธ๋ก์ด๋ ๋ฉ์๋์ ์ฌ์ฉ๋์ด, ํด๋น ์ฝ๋๊ฐ ์คํ๋ ๋ ๋จ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
public synchronized void criticalSection() {
// ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
}
2. ReentrantLock
๋ ์ ๊ตํ ๋ฝ์ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. tryLock(), lockInterruptibly()์ ๊ฐ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ReentrantLock lock = new ReentrantLock();
public void criticalSection() {
lock.lock();
try {
// ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
} finally {
lock.unlock();
}
}
2. ์ธ๋งํฌ์ด Semaphore
ํน์ ์์์ ์ ๊ทผํ ์ ์๋ ์ค๋ ๋ ์๋ฅผ ์ ํํ๋ ๋๊ธฐํ ๊ธฐ๋ฒ
Signal Mechanism ์ ํธ ๋ฉ์ปค๋์ฆ
์ค๋ ๋๊ฐ ์์์ ์์ฒญํ ๋, ์ธ๋งํฌ์ด์ ์ ํธ(ํ๊ฐ)๋ฅผ ํตํด ์์์ ์ ๊ทผ ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๊ณ , ๊ทธ ์ ํธ์ ๋ฐ๋ผ ์ ๊ทผ์ด ํ์ฉ๋๊ฑฐ๋ ๋๊ธฐํ๊ฒ ๋๋ ๋ฐฉ์์ด๋ค.
์๋ ๋ฐฉ์
- ์ค๋ ๋๊ฐ ์์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, acquire()๋ฅผ ํธ์ถํด ์ธ๋งํฌ์ด์ ํ๊ฐ๋ฅผ ์์ฒญํ๋ค.
- ํ๊ฐ๊ฐ ๋จ์ ์์ผ๋ฉด ์์์ ์ ๊ทผํ ์ ์๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๊ธฐ ์ํ๊ฐ ๋๋ค.
- ์์ ์ฌ์ฉ์ด ๋๋ ํ release()๋ฅผ ํธ์ถํด ํ๊ฐ๋ฅผ ๋ฐํํ๊ณ , ๋๊ธฐ ์ค์ธ ๋ค๋ฅด ์ค๋ ๋๊ฐ ์์์ ์ ๊ทผํ ์ ์๋๋ก ์ ํธ๋ฅผ ๋ณด๋ธ๋ค.
- acquire() : ์ธ๋งํฌ์ด์ ํ๊ฐ(permission)์ ์์ฒญํ๋ ์ญํ ์ ํ๋ค. ์ธ๋งํฌ์ด์ ํ์ฌ ํ๊ฐ ๊ฐ๋ฅ ์๊ฐ 0๋ณด๋ค ํฌ๋ฉด ์ค๋ ๋๋ ์ฆ์ ์ ๊ทผ ๊ถํ์ ์ป๊ณ ์์์ ์ ๊ทผํ ์ ์๋ค. ๋ฐ๋ฉด, ํ๊ฐ ๊ฐ๋ฅ ์๊ฐ 0์ด๋ผ๋ฉด, ํด๋น ์ค๋ ๋๋ ์์์ ์ ๊ทผํ๊ธฐ ์ํด ๋๊ธฐ ์ํ์ ๋์ด๊ฒ ๋๋ค.
- release() : ์์์ ์ฌ์ฉ์ด ๋๋ ํ, ์ ๊ทผ ๊ถํ์ ๋ฐํํ๋ ์ญํ ์ ํ๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋๊ธฐ ์ค์ธ ์ค๋ ๋๊ฐ ์์์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
ํน์ง
์ธ๋งํฌ์ด๋ ํ์ฉ๋ ์์ ์ฐ๋ ๋๊น์ง๋ง ์์์ ์ ๊ทผํ ์ ์๋๋ก ์ ์ดํ๋ค. ์๋ฅผ ๋ค์ด, ์ธ๋งํฌ์ด๊ฐ 3์ด๋ผ๋ฉด ์ต๋ 3๊ฐ์ ์ค๋ ๋๊ฐ ๋์์ ์์์ ์ ๊ทผํ ์ ์๋ค.
1. ๋ฐ์ด๋๋ฆฌ ์ธ๋งํฌ์ด
๊ฐ์ด 1์ธ ์ธ๋งํฌ์ด๋ก, ๋ฎคํ ์ค์ ์ ์ฌํ๊ฒ ์๋ํ๋ค.
2. ์นด์ดํ ์ธ๋งํฌ์ด
1๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ค์ ๋์ด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๊ฒ ํ์ฉํ๋ค.
๊ตฌํ
์๋ฐ์์๋ java.util.concurrent.Semaphore ํด๋์ค๋ฅผ ํตํด ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
Semaphore semaphore = new Semaphore(3); // ์ต๋ 3๊ฐ์ ์ค๋ ๋๊ฐ ์ ๊ทผ ๊ฐ๋ฅ
public void accessResource() {
try {
semaphore.acquire();
// ์ต๋ 3๊ฐ์ ์ค๋ ๋๋ง ์ ๊ทผ ๊ฐ๋ฅ
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
semaphore.release();
}
}
๐ค ๋ฎคํ ์ค๊ฐ ์๋๋ฐ ์ ์ธ๋งํฌ์ด๋ ์๋๊ฑฐ์ง?
๋ฎคํ ์ค์ ์ธ๋งํฌ์ด ๋๋ค ๊ณต์ ์์์ ๋ํ ์ ๊ทผ์ ์ ์ดํ์ง๋ง, ๊ฐ๊ฐ์ ์ฌ์ฉ ๋ชฉ์ ์ด ๋ค๋ฅด๊ณ ๊ทธ ์ฐจ์ด์ ๋๋ฌธ์ ๋ ๋ค ํ์ํ๋ค.
1. ๋๊ธฐ ์ ๊ทผ ์ ์ด์ ํ์์ฑ
- ๋ฎคํ ์ค๋ ์์์ ๋ํด ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๊ฒ ํ๋. ๋ฐ๋ผ์ ํ์ ๋ ์์์ ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ ๋ ์ ํฉํ๋ค.
- ์ผ๋ถ ์์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํด๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ด ๋ ์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํด ์ ํ๋ ์์ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋๋ก ์ ์ดํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค.
2. ์์์ ํจ์จ์ ์ฌ์ฉ
- ๋ฎคํ ์ค๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์์์ ์ ์ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋นํจ์จ์ ์ผ ์ ์๋ค. ์์์ด ์ถฉ๋ถํ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋ ์ ์๋๋ฐ๋ ํ ์ค๋ ๋์ฉ ์ ๊ทผํ๋๋ก ์ ํํ๋ฉด ์์คํ ์ ํจ์จ์ด ๋จ์ด์ง๋ค.
- ์นด์ดํ
์ธ๋งํฌ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด ์์์ ํ์ฉ๋๋ฅผ ๋์ผ ์ ์๋ค.
- ์ : ํ๋ฆฐํฐ ์๋ฒ์์ ์ฌ๋ฌ ๋์ ํ๋ฆฐํฐ๋ฅผ ๋์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ค๋ฉด ์ธ๋งํฌ์ด๊ฐ ๋ ์ ํฉํ๋ค
3. ๋ ์ ์ฐํ ๋๊ธฐํ ์ ์ด
- ๋ฎคํ ์ค๋ ๋ ์ ์ ์ ๊ทผ์ ๋ณด์ฅํ๋ ๊ฐ๋จํ ๋ฐฉ์์ด๋ ์ฌ์ฉ์ด ํธ๋ฆฌํ์ง๋ง, ์ธ๋งํฌ์ด๋ ์ฌ๋ฌ ์์์ ๋์ ์ ๊ทผ์ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ํจ์ฌ ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋๋ค.
- ์ธ๋งํฌ์ด๋ ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ฐ๋ฅ์ฑ์ ๋์ ์ผ๋ก ์ ์ดํ ์ ์๋ค.
- ์ : ์์์ ์ํ์ ๋ฐ๋ผ acquire(), release()๋ฅผ ํตํด ์ ๊ทผ ๊ฐ๋ฅ ์๋ฅผ ์กฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ ์ํฉ์ ๋ง๊ฒ ์์์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋ฐ] ์์ญ ํนํ ์ธ์ด, Domain Specific Language (1) | 2024.10.09 |
---|---|
[Java] I/O Stream (2) | 2024.10.07 |
[Java] volatile ํค์๋ - ๋ณ์์ ๊ฐ์์ฑ, ์ฌ์ ๋ ฌ ๋ฐฉ์ง (0) | 2024.10.01 |
[Java] Thread์ stop()๊ณผ interrupt()์ ๋น๊ต (2) | 2024.10.01 |
[Java] ์ค๋ ๋ ์๋ช ์ฃผ๊ธฐ (1) | 2024.10.01 |