ํฐ์คํ ๋ฆฌ ๋ทฐ
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ๋ชจ๋ํฐ
dirmathfl 2020. 6. 20. 01:30๋๊ธฐํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋งํฌ์ด ์ธ์ ๊ณ ์์ค์ธ ๋ชจ๋ํฐ๋ผ๋ ๋ฐฉ์์ด ์๋ค. ์ด์์ฒด์ ์์๋ mutex๋ฅผ ์ ๊ณตํ์ง๋ง ์๋ฐ์์๋ ๋ชจ๋ํฐ๋ฅผ ํ์ฉํ์ฌ ๋๊ธฐํ์ ๋ํ ๋ฌธ์ ๋ฅผ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค. ๋ชจ๋ํฐ ๋ฐฉ์์ synchronized๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค.
์๋ฐ์์ ์ธ๋ชจํฌ์ด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ์ด๊ธฐ์ ์ ๊ทผํ ์ ์๋ ์ฐ๋ ๋์ ์๋ฅผ ์ ์ ํ ์ง์ ํด์ฃผ๊ณ ์ด๋ฅผ ํ๋จํ์ฌ acquire, releaseํ์ฌ์ผ ํ๋ค. ํ์ง๋ง synchroronized๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณด๋ค ๊ฐํธํ๊ฒ ๋๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
BankAccount Problem (USE synchronized)
class BankAccount {
int balance;
boolean p_turn = true;
synchronized void deposit(int amount) {
int temp = balance + amount;
System.out.print("+");
balance = temp;
notify();
p_turn = false;
try {
wait();
} catch (InterruptedException e) {}
}
synchronized void withdraw(int amount) {
while (p_turn)
try {
wait();
} catch (InterruptedException e) {}
int temp = balance - amount;
System.out.print("-");
balance = temp;
notify();
p_turn = true;
}
int getBalance() {
return balance;
}
}
class Parent extends Thread {
BankAccount b;
int count;
Parent(BankAccount b, int count) {
this.b = b;
this.count = count;
}
public void run() {
for (int i = 0; i < count; i++)
b.deposit(1);
}
}
class Child extends Thread {
BankAccount b;
int count;
Child(BankAccount b, int count) {
this.b = b;
this.count = count;
}
public void run() {
for (int i = 0; i < count; i++)
b.withdraw(1);
}
}
class Test {
static final int MAX = 100;
public static void main(String[] args) throws InterruptedException {
BankAccount b = new BankAccount();
Parent p = new Parent(b, MAX);
Child c = new Child(b, MAX);
p.start();
c.start();
p.join();
c.join();
System.out.println( "\nbalance = " + b.getBalance());
}
}
์ธ๋ชจํฌ์ด๋ฅผ ํตํด ํด๊ฒฐ ํ์๋ ์ํ ๊ณ์ข ๋ฌธ์ ๋ฅผ synchronized๋ฅผ ์ฌ์ฉํ์ฌ์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์๋ค. ์๊ณ ๊ตฌ์ญ์ ํด๋น ํ๋ deposit, withdraw์ synchrozined๋ฅผ ๋ถ์ด๊ฒ ๋๋ฉด ์๊ณ ๊ตฌ์ญ์ ๋์์ ์ ๊ทผํ๋ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
synchronized๋ wait(), notify() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ฐ๊ฐ์ ์ญํ ์ ํน์ ์ค๋ ๋๊ฐ wait() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ๋ค๋ฅธ ์ฐ๋ ๋๋ก ๋ถํฐ notify() ๋ ๋๊น์ง ์ฐ๋ ๋๋ ๋๊ธฐ์ํ๊ฐ ๋๋ค. ์ด๋ฅผ ์๊ณ ๊ตฌ์ญ์ ํ์ฉํ๋ฉด, ๊ฐ ์ฐ๋ ๋์ ๋ํ ์คํ ์์๋ ๋ณด์ฅํ ์ ์๋ค.
'๐๏ธโโ๏ธ ๊ธฐ๋ฐ ๋ค์ง๊ธฐ > ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด์์ฒด์ : ํ์ด์ง (0) | 2020.06.21 |
---|---|
์ด์์ฒด์ : ์ฃผ๊ธฐ์ต์ฅ์น ๊ด๋ฆฌ (0) | 2020.06.21 |
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ๊ต์ฐฉ์ํ (0) | 2020.06.20 |
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ์์ฑ์ โ ์๋น์ (0) | 2020.06.20 |
์ด์์ฒด์ : ํ๋ก์ธ์ค ๋๊ธฐํ - ์ธ๋งํฌ์ด (0) | 2020.06.19 |