π μ°Έκ³ ν μ±
- κΈ°λ³Έμ μΈ κ°λ μ μ 리νκ³ μΆκ°μ μΌλ‘ κΆκΈν κ²λ€μ μ 리νμ΅λλ€ -
π₯ π₯ π₯
βοΈ λκΈ°ν_ 539p
• λκΈ°ν
: νλμ μμ μ΄ μλ£λ ν λ€λ₯Έ μμ μ μννλ κ²
• λΉλκΈ°ν
: νλμ μμ λͺ λ Ή μ΄ν μλ£ μ¬λΆμ μκ΄μμ΄ λ°λ‘ λ€λ₯Έ μμ λͺ λ Ήμ μννλ κ²
• λ©μλ λκΈ°ν
: 2κ°μ μ°λ λκ° λμμ λ©μλλ₯Ό μ€νν μ μλ€λ κ²
μ κ·Όμ§μ μ synchronized 리ν΄νμ
λ©μλλͺ
(μ
λ ₯λ§€κ°λ³μ){ }
λ©μλλ₯Ό λκΈ°νν λλ λκΈ°ννκ³ μ νλ λ©μλμ λ¦¬ν΄ νμ μμ synchronized ν€μλλ§ λ£μΌλ©΄ λλ€. μ΄λ κ² λλ©΄ λμμ 2κ°μ μ°λ λμμ ν΄λΉ λ©μλλ₯Ό μ€νν μ μκ²λλ€.
• λΈλ‘ λκΈ°ν
: 2κ°μ μ°λ λκ° λμμ ν΄λΉ λΈλ‘μ μ€νν μ μλ€λ κ²
μ΄λ€ λ©μλ {
synchronized (μμμ κ°μ²΄) { }
}
μ 체 λ©μλλ₯Ό λκΈ°ννμ§ μκ³ μνλ λΆλΆλ§ λκΈ°νν μ μκ² νλ€. νμν μ½λλ§ λκΈ°νλ₯Ό μ§ννκΈ° λλ¬Έμ λ©μλ λκΈ°νλ³΄λ€ λ μ λ°νκ² μ½λλ₯Ό μ€μ ν μ μλ€. μ¬κΈ°μ μμμ κ°μ²΄λ λ΄κ° μ νν μ΄λ€ κ°μ²΄λ‘ μ κΈμ μ€μ νκ² λ€λ μλ―Έλ‘ μκ°νλ©΄ λκ³ μ£Όλ‘ thisλ₯Ό μ¬μ©ν΄μ νμ¬ μΈμ€ν΄μ€ κ°μ²΄λ‘ μ κΈμ μ€μ νλ€. κ·Έλ¬λ©΄ μ΄ μ κ·Ό κ°μ²΄μ κ°μ κ°μ²΄λ₯Ό κ°μ§λ λΈλ‘λ€μ λμ μ¬μ©μ΄ λΆκ°νλ€.
• λ©μλ λκΈ°νμ λΈλ‘ λκΈ°ν
class MyData {
Object keyObject = new Object();
synchronized void abc() {
...
}
synchronized void bcd() {
...
}
synchronized void cde() {
...
}
void def() {
synchronized (keyObject) {
...
}
}
void efg() {
synchronized (keyObject) {
...
}
}
}
abcμ bcdλ λκΈ°ν λ©μλμ΄λ€. cdeμ def κ·Έλ¦¬κ³ efgλ λκΈ°ν λΈλ‘μ κ°μ§κ³ μλ€. μ¬κΈ°μ μ£Όμ κΉκ² λ΄μΌν μ μ μ΄λ€ λ©μλκ° λκΈ°ν λ©μλμΈμ§ λκΈ°ν λΈλ‘μΈμ§κ° μλλ€. κ° λ©μλμ λΈλ‘μ΄ μ΄λ€ ν€λ‘ μ κΈμ΄ λμ΄μλμ§λ₯Ό λ΄μΌνλ€. abcμ bcd κ·Έλ¦¬κ³ cdeλ this κ°μ²΄λ‘ μ κΈμ΄ λμ΄μλ€. κ·Έλ¬λ©΄ abc,bcd,cdeλ λμμ μ¬μ©ν μ μλ€. defμ efgλ keyObjectλ‘ μ κΈμ΄ λμ΄μλ€. κ·Έλ¬λ©΄ defμ efgλ λμμ μ¬μ©ν μ μλ€.
μ¬κΈ°μ κ° ν€λ thisμ keyObjectλ‘ λλλ€. ν€κ° λ€λ₯΄λ€λ©΄? λμμ μ¬μ©κ°λ₯νλ€. abcλ cdeμ λμμ μ¬μ© λΆκ°νμ§λ§ abcκ° defμ λμ μ¬μ©μ κ°λ₯ν κ²μ΄λ€. λκΈ°νμμ μ€μν κ²μ μ΄λ€ κ°μ²΄λ‘ μ κΈμ μ€μ νλμ§λ€.
μλ§ κ°μ ν€λ₯Ό κ°μ§λ λ©μλλ₯Ό λμμ μ¬μ© λΆκ°ν μ΄μ λ ν€κ° νλμ΄κΈ° λλ¬ΈμΌ κ²μ΄λ€. μ²μμ abcκ° ν€λ₯Ό μ μ νκ³ ν΄μΌν νλμ λ§μΉλ©΄ abcλ ν€λ₯Ό λ°λ©ν κ²μ΄λ€. μ΄λ ν€λ λ€μ μμμΈ bcdλ‘ λμ΄κ°μ§ μλλ€. bcdμ cdeκ° λ°λ©λ ν€λ₯Ό κ°μ§κΈ° μν΄ μλ‘ κ²½μν κ²μ΄κ³ ν€λ₯Ό μ μ ν λ©μλκ° λ¨Όμ νλνκ² λλ€.
βοΈ μ°λ λ 6κ°μ§ μν_ 552p
• NEW μν
: Thread κ°μ²΄λ₯Ό new ν€μλλ₯Ό μ΄μ©ν΄ μμ±ν μμ μΈ μ€ν μ΄μ μν
Thread thread = new Thread() {
@Override
public void run() {
for(long i = 0; i < 1000000000L; i++) {}
}
}
• RUNNABLE μν
: start( ) λ©μλλ₯Ό νΈμΆν μν, μ€ν μνλ‘ μΈμ λ μ§ κ° μ μλ μν
thread.start();
• TERMINATED μν
: run( ) λ©μλκ° μμ ν μ’ λ£λ μ€νμ λ§μΉ μν
try {
myTread.join();
} catch (InterruptedException e) {}
• TIMED_WAITING μν
: μ μ λ©μλμΈ Thread.sleep λλ μΈμ€ν΄μ€ λ©μλμΈ joinμ΄ νΈμΆλ μν
Thread t1 = new Thread(() -> {
try {
Thread.sleep(2000); // 2μ΄ λμ κΈ°λ€λ¦Ό
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
t1.join(1000); // μ΅λ 1μ΄ λμ t1μ κΈ°λ€λ¦Ό
} catch (InterruptedException e) {
e.printStackTrace();
}
});
μμ μ½λλ Runnable μνμμ μΌμμ μ§ μνλ‘ μ νλλ TIMED_WAITING μνμ΄λ€. TIMED_WAITING μνλ μ£Όλ‘ sleep(long millis)λ₯Ό νΈμΆνκ±°λ join(long millis)κ° νΈμΆλμ λλ€.
Thread.sleep( )μ μ΄ λ©μλλ₯Ό νΈμΆν μ°λ λλ₯Ό μΌμ μ μ§νλΌλ μλ―Έλ‘ μΌμμ μ§ μκ° λμ CPUλ₯Ό μ΄λ€ μ°λ λκ° μ¬μ©νλ μκ΄νμ§ μλλ€. μ°λ λ κ°μ²΄.join( ) λ©μλλ νΉμ μ°λ λ κ°μ²΄μκ² μΌμ μκ° λμ CPUλ₯Ό ν λΉνλΌλ μλ―Έλ€.
μ°λ λ t1μ sleep λ©μλλ‘ μΌμμ μ§κ° λμκ³ 2μ΄μ μκ°λμ μ΄λ€ μ°λ λκ° CPUλ₯Ό μ¬μ©νλ μ κ²½μ°μ§ μμ κ²μ΄λ€. κ·Έλ¬λ μ°λ λ t2λ join λ©μλλ₯Ό μ¬μ©νκΈ°μ t2κ° μ μ λ©μΆ 1μ΄ λμ t1 μ°λ λκ° CPUλ₯Ό μ¬μ©νλλ‘ νλ€.
• BLOCKED μν
: λκΈ°ν λ©μλ λλ λκΈ°ν λΈλ‘μ μ€ννκ³ μ ν λ μ΄λ―Έ λ€λ₯Έ μ°λ λκ° ν΄λΉ μμμ μ€ννκ³ μλ κ²½μ° λ°μ.
Thread t1 = new Thread("thread1") {
public void run() {
mc.syncMethod();
};
};
Thread t2 = new Thread("thread2") {
public void run() {
mc.syncMethod();
};
};
Thread t3 = new Thread("thread3") {
public void run() {
mc.syncMethod();
};
};
μ°λ λ t1μ΄ λ¨Όμ μ€ννκ³ μμ λ, t1μ΄ μ€νμ μλ£νκ³ ν΄λΉ λκΈ°ν μμμ μ΄μ λ₯Ό λ°λ©ν λκΉμ§ κΈ°λ€λ €μΌνλ€. μ΄λ μ΄λ° μν©μ BLOCKED μνλΌκ³ νλ€.
t1μ΄ λ°λ©μ νκ² λλ©΄ κ·Έ λ€μ μμμΈ t2κ° ν€λ₯Ό κ°μ§ κ² κ°μ§λ§ μ¬μ€ κ·Έλ μ§ μλ€. ν€κ° λ°λ©λ μκ°λΆν° t2μ t3λ μλ‘ ν€λ₯Ό κ°μ§κΈ° μν΄ κ²½μν κ²μ΄λ€. κ·Έλ κ² λ¨Όμ ν€λ₯Ό κ°μ§κ² λ μ°λ λκ° t1 λ€μμΌλ‘ μ€ννκ² λ κ²μ΄λ€.
void startAll() {
t1.start();
t2.start();
t3.start();
}
startAll λ©μλμμ t1, t2, t3 μ°λ λκ° λμμ μ€ννλ €κ³ νλ€. κ·Έλ¬λ©΄ λΉμ°νκ² t1, t2, t3λ κ²½μν κ²μ΄κ³ ν€λ₯Ό μ°¨μ§ν μ°λ λ λ¨Όμ μ€νλλ©° λλ¨Έμ§ λ μ°λ λλ BLOCKED μνκ° λ κ²μ΄λ€.
• WAITING μν
: μ°λ λκ° λ¬΄νμ κΈ°λ€λ¦¬κ³ μλ μν
Thread t = new Thread(() -> {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
μκ°μ μ§μ νμ§ μμ join λ©μλ λλ object.wait λ©μλλ₯Ό μ¬μ©νκ² λλ©΄ WAITING μνκ° λλ€. joinμ λ€λ₯Έ μ°λ λκ° λλ λκΉμ§ κΈ°λ€λ €μΌνκ³ waitλ notify( )λ‘ κΉ¨μΈ μ μλ€.
lock κ°μ²΄λ‘ μ κΈμ 건 μ°λ λ tλ lock.wait( )μΌλ‘ lockμ μ κΉ λ°λ©νλ€. μΈμ κΉμ§ λ°λ©ν μ§ μκ°μ μ§μ νμ§ μμκΈ° λλ¬Έμ notify( )λ‘ νΈμΆνμ¬ WAITING μνμμ λΉ μ Έλμ€λλ‘ ν΄μΌνλ€.
synchronized (lock) {
lock.notify();
}
'π Java > μλ°μμ μ 볡' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Java] 컬λ μ νλ μμν¬ κ΅¬μ‘°, List<E>μ ArrayList<E>, Vector<E>, LinkedList<E> μ°¨μ΄μ (1) | 2025.06.18 |
---|---|
[Java] μ λ€λ¦ (1) | 2025.05.27 |
[Java] μ°λ λ, μ°λ λμ μμ±, λ°λͺ¬μ°λ λ (0) | 2025.05.20 |
[Java] μμΈμ²λ¦¬, μμΈμ κ°, μ¬μ©μ μ μ μμΈ ν΄λμ€ (0) | 2025.05.14 |
[Java] μΌλ° μμΈμ μ€ν μμΈ (0) | 2025.05.08 |