
Chapter 13 - μ°λ λ(Thread)
1. νλ‘μΈμ€μ μ°λ λ
- process : μ€ν μ€μΈ νλ‘κ·Έλ¨
- OSλ‘λΆν° μ€νμ νμν μμ(λ©λͺ¨λ¦¬)μ ν λΉλ°μ ν νλ‘μΈμ€κ° λ¨
- λ°μ΄ν°, λ©λͺ¨λ¦¬ λ±μ μμ, μ°λ λλ‘ κ΅¬μ±
- μ°λ λκ° νλ‘μΈμ€μ μμμ μ΄μ©ν΄μ μ€μ μμ μν
- λͺ¨λ νλ‘μΈμ€μμ μ΅μ νλμ μ°λ λκ° μ‘΄μ¬
- λ μ΄μμ μ°λ λλ₯Ό κ°μ§λ©΄
λ©ν°μ°λ λ νλ‘μΈμ€
- λ©λͺ¨λ¦¬ νκ³μ λ°λΌ μμ±ν μ μλ μ°λ λ μκ° κ²°μ
λ©ν°νμ€νΉκ³Ό λ©ν°μ°λ λ©
- λλΆλΆμ OSλ λ©ν°νμ€νΉ μ§μ
- μ¬λ¬ κ°μ νλ‘μΈμ€κ° λμμ μ€ν κ°λ₯
- λ©ν°μΊμ€ν
μ²λΌ λ©ν° μ°λ λ©μ νλμ νλ‘μΈμ€ λ΄μμ μ¬λ¬ μ°λ λκ° λμμ μμ
μ μν
- μ½μ΄κ° μμ£Ό 짧μ μκ° λμ μ¬λ¬ μμ μ λ²κ°μκ°λ©° μνν¨ -> λͺ¨λ λμμ μνλλ κ²μ²λΌ λκ»΄μ§
- μ) νμΌ λ€μ΄λ‘λλ₯Ό νλ©΄μ λ©μ μ λ₯Ό νλ νλ
- λ§μ μ°λ λλ₯Ό κ°μ§λ€κ³ νλ‘μΈμ€μ μ±λ₯μ΄ μ¬λΌκ°λ κ²μ μλ
λ©ν°μ°λ λ©μ μ₯λ¨μ
- μ₯μ
- CPU μ¬μ©λ₯ ν₯μ
- μμμ λ ν¨μ¨μ μΌλ‘ μ¬μ©
- μ¬μ©μμ λν μλ΅μ± ν₯μ
- μμ μ΄ λΆλ¦¬λμ΄ μ½λκ° κ°κ²°ν΄μ§
- νλ‘μΈμ€λ₯Ό μμ±νλ κ²μ λΉν΄ μ°λ λλ₯Ό μμ±νλ κ²μ΄ λ μ μ μκ°κ³Ό κ³΅κ° νμ
- λ¨μ
- μ¬λ¬ μ°λ λκ° κ°μ νλ‘μΈμ€μ μμμ 곡μ νλ―λ‘ λκΈ°ν, κ΅μ°©μν λ¬Έμ λ€μ κ³ λ €ν΄μΌ ν¨
- κ΅μ°©μν : λ μ°λ λκ° μλ‘ νμν μμμ μ μ ν μνμμ κΈ°λ€λ¦¬λλΌ μ§μμ΄ λ©μΆ°μ§λ μν©
2. μ°λ λμ ꡬνκ³Ό μ€ν
- ꡬν λ΄μ©μ run() λ©μλμ λͺΈν΅μ ꡬν
- Thread ν΄λμ€λ₯Ό μμ
class MyThread extends Thread{
public void run(){
// ꡬν λ΄μ©
}
}
- Ruunnable μΈν°νμ΄μ€λ₯Ό ꡬν
- λ€λ₯Έ ν΄λμ€λ₯Ό μμλ°μ μ μμΌλ―λ‘ μ΄ λ°©λ²μ λ μ νΈ
class MyThread implements Runnable{
public void run(){
// ꡬν λ΄μ©
}
}
- λ λ°©μμ μΈμ€ν΄μ€ μμ± λ°©μμ΄ λ€λ¦
- Thread ν΄λμ€λ₯Ό μμλ°λ κ²½μ°μ new μ°μ°μλ‘ μμ±
- Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν κ²½μ° new Thread() μμ±μμ 맀κ°λ³μλ‘ μ 곡ν΄μΌ ν¨
- μ°λ λ λ΄λΆ μ½λμμ run νΈμΆ μ Runnableμ run()μ νΈμΆνκ² ν΄λ¨μΌλ―λ‘ run() λ©μλλ₯Ό μ€λ²λΌμ΄λ© ν νμκ° μμ
- λ¨ Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν κ²½μ°μ Thread ν΄λμ€μ λ©μλλ₯Ό μ§μ νΈμΆν μ μμ
- μ 곡λ static currentThread()λ₯Ό νΈμΆνμ¬ μ°λ λμ λν μ°Έμ‘°λ₯Ό κ°μ ΈμμΌ ν¨
- ex) Threadμ μ΄λ¦μ μκ³ μΆμ λ
Thread.currentThread().getName()
νΈμΆ
- μ°λ λμ μ΄λ¦μ μμ±μ λ° λ©μλλ‘ λ³κ²½ κ°λ₯, μ§μ μ μ νλ©΄
Thread-λ²νΈ
μ°λ λμ μ€ν - start()
- run()μ ꡬννλ€κ³ μ°λ λκ° μ€νλλ κ²μ΄ μλ
- start()λ‘ μ°λ λλ₯Ό νΈμΆν΄μΌλ§ μ€ν
- μ€νλκΈ°λ³΄λ¨ μ€ν λκΈ°λ‘ λ°λκ³ μμ μ μ°¨λ‘κ° λμ΄μΌ μ€ν
- ν λ² μ’
λ£λ μ°λ λλ λ€μ μ€νν μ μμ
- ν λ² λ μμ μ μννκΈ° μν΄μ new μμ±μλ‘ μλ‘μ΄ μΈμ€ν΄μ€λ₯Ό μμ± ν μ€ν
3.start()μ run()
- start()λ μλ‘μ΄ μ°λ λκ° μμ μ μ€ννλλ° νμν νΈμΆ μ€νμ μμ± ν run()μ νΈμΆ
- λ κ° μ΄μμ νΈμΆ μ€νμ΄ μ‘΄μ¬ν λ μ€μΌμ€λ¬κ° μ ν μμμ μν΄μ κ΅λλ‘ μ€ν
- νΈμΆ μ€νμ κ°μ₯ μμ μλ λ©μλκ° μ€ν (λλ¨Έμ§ λ©μλλ λκΈ°)
- μ£Όμ΄μ§ μκ° λ΄λ‘ μμ μ λ§μΉμ§ λͺ»νλ€λ©΄ μμ μ μ°¨λ‘κ° λμμ¬ λκΉμ§ λκΈ°
main μ°λ λ
- main λ©μλμ μμ
λν μ°λ λκ° μ€ν -> main μ°λ λλΌκ³ λΆλ¦
- νλ‘μΈμ€κ° μ΅μλ‘ νμν μ°λ λ
- main μ°λ λλ μ¬μ©μ μ°λ λμ΄λ©° μ€ν μ€μΈ μ¬μ©μ μ°λ λκ° νλλ μμ λ νλ‘κ·Έλ¨μ μ’ λ£
- ν μ°λ λμμ μμΈ λ°μ μ’ λ£ μ λ€λ₯Έ μ°λ λμλ μν₯μ λ―ΈμΉμ§ μμ
- start()κ° μλ run() νΈμΆ μ μ°λ λκ° μμ±λμ§ μκ³ run() νΈμΆ ν νΈμΆ μ€νμ μμ
4. μ±κΈμ°λ λμ λ©ν°μ°λ λ
λ κ°μ μμ μ νλμ μ°λ λλ‘ μ²λ¦¬νλ κ²½μ°μ λ κ°μ μ°λ λλ‘ μ²λ¦¬νλ κ²½μ°
- CPUλ§μ μ¬μ©νλ μ±κΈ μ½μ΄μμ λ©ν°μ°λ λ λ³΄λ€ μ±κΈ μ°λ λλ‘ νλ‘κ·Έλλ° νλ κ²μ΄ ν¨μ¨μ
- μ²λ¦¬ μκ°μ λμΌνκ² κ±Έλ¦¬μ§λ§ λ©ν°μ°λ λλ 컨ν μ€νΈ μ€μμΉμ μκ°λ μΆκ°λκ³ ν μ°λ λκ° λ€λ₯Έ μ°λ λμ μΆλ ₯μ΄ λλκΈ°λ₯Ό κΈ°λ€λ €μΌ νλ―λ‘ λ μ€λ κ±Έλ¦°λ€.
- 컨ν μ€νΈ μ€μμΉ μ λ€μμ μ€νν΄μΌ ν μμΉμΈ PC λ±μ μ 보λ₯Ό μ μ₯νκ³ μ½μ΄μ¨λ€.
- νλ‘μΈμ€ 컨ν μ€νΈ μ€μμΉλ³΄λ¨ μ°λ λ 컨ν μ€νΈ μ€μμΉμ΄ λ μ μ μκ°μ΄ μμλλ€.
- μ±κΈ μ½μ΄μΌ λμλ λ€λ₯΄κ² λ©ν° μ½μ΄ μΌ λλ λ μ°λ λκ° μνλ μ μμΌλ―λ‘ κ²ΉμΉλ λΆλΆμ΄ λ°μ
- νλ©΄ λ±μ μμμ λκ³ μ°λ λκ° κ²½μ
- μ€ν μ€μΈ νλ‘μΈμ€λ μ΄ OS νλ‘μΈμ€ μ€μΌμ€λ¬μ μν₯μ λ°μ
- JVMμ΄ μ°λ λ μ€μΌμ€λ¬λ‘ μ°λ λμ μ€ν μμ λ° μ€ν μκ°μ΄ κ²°μ λλ κ²μ²λΌ νλ‘μΈμ€λ OSμ νλ‘μΈμ€ μ€μΌμ€λ¬λ‘ κ²°μ
- μλ°λ OS λ 립μ μ΄μ§λ§ μ€μ λ‘ μ°λ λλ OSμ μ’ μμ
- λ μ°λ λκ° μλ‘ λ€λ₯Έ μμμ μ¬μ©νλ κ²½μ°μλ λ©ν° μ°λ λ νλ‘μΈμ€κ° λ ν¨μ¨μ
- λ°μ΄ν°λ₯Ό μ λ ₯λ°λ μμ , λ€νΈμν¬λ‘ νμΌμ μ£Όκ³ λ°λ μμ λ±λ± μΈλΆκΈ°κΈ°μμ μ μΆλ ₯μ΄ νμν λ
- μ±κΈ μ°λ λμμλ μΈλΆμ μ λ ₯μ κΈ°λ€λ¦¬λ λμ μλ¬΄λ° μμ λ ν μ μμ
- λ κ°μ μ°λ λμμλ μ¬μ©μμ μ λ ₯μ κΈ°λ€λ¦¬λ λμ λ€λ₯Έ μ°λ λκ° μμ μ μ²λ¦¬
5. μ°λ λμ μ°μ μμ
- μ°μ μμ κ°μ λ°λΌ μ°λ λκ° μ»λ μ€ν μκ°μ΄ λ¬λΌμ§
μ°λ λμ μ°μ μμ μ§μ νκΈ°
- μ°μ μμμ λ²μλ 1~10μ΄λ©° μ«μκ° λμμλ‘ μ°μ μμκ° λμμ§
- μ°λ λλ₯Ό μμ±ν μ°λ λλ‘λΆν° μ°μ μμλ₯Ό μμλ°μ
- main λ©μλλ₯Ό μννλ μ°λ λλ μ°μ μμκ° 5
- void setPriority(int newPriority) : μ°λ λμ μ°μ μμλ₯Ό μ§μ ν κ°μΌλ‘ λ³κ²½
- int getPriority() : μ°λ λμ μ°μ μμλ₯Ό λ°ν
- λ©ν° μ½μ΄μμλ μ°λ λμ μ°μ μμμ λ°λ₯Έ μ°¨μ΄κ° κ±°μ μμ
- κ·Έμ λ λ§μ μ€ν μκ°κ³Ό μ€ν κΈ°νλ₯Ό κ°κ² λ κ²μ΄λΌκ³ κΈ°λν μλ°μ μμ
- PriorityQueueλ₯Ό μ¬μ©νμ¬ μ°μ μμκ° λμ μμ μ λ¨Όμ μ²λ¦¬νλλ‘ κ΅¬ννλ κ² λ λμ μλ μμ
6. μ°λ λ κ·Έλ£Ή(thread group)
- μ°λ λ κ·Έλ£Ήμ μλ‘ κ΄λ ¨λ μ°λ λλ₯Ό κ·Έλ£ΉμΌλ‘ λ€λ£¨κΈ° μν κ²
- ν΄λλ₯Ό μμ±ν΄μ κ΄λ ¨λ νμΌμ κ΄λ¦¬νλ κ²κ³Ό λΉμ·ν¨
- μ°λ λ κ·Έλ£Ήμ λ€λ₯Έ μ°λ λ κ·Έλ£Ήμ ν¬ν¨ μν¬ μ μμ
- μ°λ λ κ·Έλ£Ήμ 보μμμ μ΄μ λ‘ λμ
- μμ μ΄ μν μ°λ λ κ·Έλ£Ήμ΄λ νμ μ°λ λ κ·Έλ£Ήλ§ λ³κ²½νλλ‘ νκΈ° μν΄
- ThreadGroupμ μ¬μ©νμ¬ μμ±
- λͺ¨λ μ°λ λλ λ°λμ μ°λ λ κ·Έλ£Ήμ ν¬ν¨λμ΄μΌ ν¨
- μ°λ λ κ·Έλ£Ήμ μ§μ νλ μμ±μλ₯Ό μ¬μ©νμ§ μλ μ°λ λλ μμ μ μμ±ν μ°λ λμ κ°μ κ·Έλ£Ήμ μνκ² λ¨
- κ·Έλ¬λ―λ‘ μ°λ¦¬κ° λ§λλ λͺ¨λ μ°λ λλ main μ°λ λ κ·Έλ£Ήμ νμ
- JVMμ μ΄ν리μΌμ΄μ
μ€ν μ mainκ³Ό systemμ΄λΌλ μ°λ λ κ·Έλ£Ή μμ±
- main λ©μλλ₯Ό μννλ μ°λ λλ main κ·Έλ£Ήμ μν¨
- κ°λΉμ§ 컬λ μ μ μννλ Finalizer μ°λ λλ system κ·Έλ£Ήμ μν¨
- ThreadGroup getThreadGroup() : μ°λ λ μμ μ΄ μν κ·Έλ£Ή λ°ν
- void uncaughtException(Tread t, Throwable e) : μ°λ λ κ·Έλ£Ήμ μ°λ λκ° μ²λ¦¬λμ§ μλ μμΈμ μν΄ μ€νμ΄ μ’ λ£λμμ λ, JVMμ μν΄ μ΄ λ©μλκ° μλμΌλ‘ νΈμΆ
7. λ°λͺ¬ μ°λ λ(daemon thread)
- μΌλ° μ°λ λμ μμ
μ λλ 보쑰μ μΈ μν μν
- μΌλ° μ°λ λκ° λͺ¨λ μ’ λ£λ μ λ°λͺ¬ μ°λ λλ μλ μ’ λ£
- μλ‘λ κ°λΉμ§ 컬λ ν°, μλ μ μ₯, νλ©΄ μλκ°±μ λ±λ±
- νΉμ μ‘°κ±΄μ΄ λ§μ‘±λλ©΄ μν ν λ€μ λκΈ°
- μ€ννκΈ° μ setDaemon(true)λ₯Ό νΈμΆ
- μ°λ λλ₯Ό λ°λͺ¬ μ°λ λλ μ¬μ©μ μ°λ λλ‘ λ³κ²½νλ λ©μλ
- λ°λμ start()λ₯Ό νΈμΆνκΈ° μ μ μ€νμν¬ κ²
- λ°λͺ¬ μ°λ λκ° μμν μ°λ λλ μλμΌλ‘ λ°λͺ¬ μ°λ λκ° λ¨
- boolean isDaemon() λ©μλλ‘ μ°λ λκ° λ°λͺ¬ μ°λ λμΈμ§ νμΈ
- νλ‘κ·Έλ¨μ μμ μ 보쑰 μμ
μ νλ λ§μ λ°λͺ¬ μ°λ λλ€μ΄ μ€νλ¨
- κ°μ system μ°λ λ κ·Έλ£Ή, main μ°λ λ κ·Έλ£Ήμ μν΄μμ
8. μ°λ λμ μ€ν μ μ΄
- μ°λ λμ μν
- NEW : μ°λ λκ° μμ±λκ³ start() νΈμΆλκΈ° μ
- RUNNALBE : μ€ν μ€ or μ€ν κ°λ₯ μν
- BLOCKED : λκΈ°ν λΈλμ μν΄ μΌμμ μ§λ μν
- WAITING, TIMED_WAITING : μ°λ λμ μμ μ΄ μ’ λ£λμ§λ μμμ§λ§ μ€ν κ°λ₯νμ§ μμ μΌμμ μ§ μν (TIME_WATINGμ μΌμμ μ§μκ°μ΄ μ§μ )
- TERMINATED : μ°λ λμ μμ μ΄ μ’ λ£λ μν
- μ°λ λμ μμ±λΆν° μλ©Έ κ³Όμ
- start()λ₯Ό νΈμΆνλ©΄ μ€ν λκΈ°μ΄μ μ μ₯ ν μκΈ° μ°¨λ‘ κΈ°λ€λ¦Ό (μ€ν λκΈ°μ΄μ νμ κ°μ ꡬ쑰)
- μμ μ μ°¨λ‘κ° λλ©΄ μ€νμν
- μ£Όμ΄μ§ μ€ν κΈ°κ°μ΄ λ€λλ κ²½μ°λ yield()λ₯Ό λ§λλ©΄ μ€ν λκΈ° μνλ‘ λ€μ μ€ν λκΈ°μ΄λ‘ λ€μ΄κ°
- μ€ν μ€ suspend(), sleep(), wait(), join(), I/O blockμ μν΄ μΌμμ μ§κ° λ μ μμ
- μ§μ λ μΌμμ μ§ μκ°μ΄ λ€ λλ κ²½μ°, notify(), resume(), interrupt()κ° νΈμΆλλ©΄ μΌμμ μ§λ₯Ό λ²μ΄λμ λ€μ μ€ν λκΈ°μ΄λ‘ λ€μ΄κ°
- μ€νμ λͺ¨λ λ§μΉλ κ²½μ°, stop()μ νΈμΆνλ κ²½μ° μ°λ λ μλ©Έ
sleep(long millis) - μΌμ κΈ°κ° λμ μ°λ λλ₯Ό λ©μΆκ² ν¨
- λ λ²μ§Έ νλΌλ―Έν°λ₯Ό λ£μ μ λλ ΈμΈμ»¨λκΉμ§ μ§μ κ°λ₯
- static λ©μλ
- μ°Έμ‘°λ³μμ μκ΄ μμ΄ νμ¬ μ€ν μ€μΈ μ°λ λμ λν΄ μλ
- μ°Έμ‘°λ³μλ₯Ό μ΄μ©ν기보λ¨
Thread.sleep()
μΌλ‘ μ¬μ©ν κ²
- μκ°μ΄ λ€ λκ±°λ interrupt()λ₯Ό νΈμΆν΄μΌ μ μμ κΉ¨μ΄λ μ€ν λκΈ° μνλ‘ λ°λ
- νμ try-catch λ¬ΈμΌλ‘ μμΈ μ²λ¦¬ νμ
- InterruptedExceptionμ λ°νμ μμΈκ° μλλ―λ‘
- try-catch λ¬Έμ λ€λ£¨λ λ©μλλ₯Ό λ§λ€μ΄μ μ¬μ©νκΈ°λ ν¨
interrupt()μ interrupted() - μ°λ λμ μμ μ μ·¨μνλ€.
- interrupt()λ μ°λ λμκ² μμ
μ λ©μΆλΌκ³ μμ²
- μ°λ λλ₯Ό κ°μ λ‘ μ’ λ£μν€μ§λ λͺ»ν¨
- μΈμ€ν΄μ€ λ³μμΈ interruptedμ μνλ₯Ό λ³κ²½νλ κ²λΏ (trueλ‘)
- interrupted() λ©μλλ‘ μ°λ λμ λν΄ interruptκ° νΈμΆλμλμ§ νμΈ κ°λ₯ (interruptedμ μνλ₯Ό νΈμΆν΄μ)
- κ·Έ ν interruptedμ μνλ₯Ό falseλ‘ λ³κ²½
- isInterrupted()λ μ°λ λμ interruptedλ₯Ό νμΈνλ κ²μΈ λμΌνμ§λ§ μν λ³κ²½ X
- sleep(), wait(), join()μμ interrupt() νΈμΆ μ μ€ν λκΈ° μνλ‘ λ°λ
- λ©μΆ°μμ λ interrupt()λ₯Ό νΈμΆνλ©΄ InterruptedExceptionμ΄ λ°μλκ³ μ°λ λμ interruptedμ μνλ falseλ‘ μλ μ΄κΈ°ν
suspend(), resume(), stop()
- suspend()λ sleep()μ²λΌ μ°λ λλ₯Ό λ©μΆκ² ν¨
- resume()μ νΈμΆνλ©΄ λ€μ μ€ν λκΈ° μν
- stop()μ νΈμΆλλ μ¦μ μ°λ λκ° μ’ λ£
- suspend()μ stop()μ΄ κ΅μ°©μνλ₯Ό μΌμΌν€κΈ° μ½κ² μμ±λμμΌλ―λ‘ μ¬μ© κΆμ₯ X
- deprecated λμ΄ μμ
- suspendμ stopμ΄ λμνμ§ μμ μ λ³μ μμ volatile μ μΈ
yield() - λ€λ₯Έ μ°λ λμκ² μ보νλ€.
- yield()λ μ°λ λ μμ μκ² μ£Όμ΄μ§ μ€ν μκ°μ λ€μ μ°¨λ‘μ μ°λ λμκ² μ보
- ν λΉλ°μ μ€ν μκ°μ μ¬μ©νλ μ€ yield()λ₯Ό λ§λλ©΄ λλ¨Έμ§ μ€ν μκ°μ ν¬κΈ°νκ³ λ€μ μ€ν λκΈ° μν
- νλ‘κ·Έλ¨μ μλ΅μ±μ λμ΄κ³ ν¨μ¨μ μΈ μ€νμ μν΄ μ¬μ©
- μ°λ λκ° μ€νμ λ©μΆκ² ν μνμμ whileμ΄ λ°λ³΅λλ€λ©΄
λ°μ λκΈ° μν(busy wating)
λ‘ μ€ν μκ°μ μλ―Έ μμ΄ λλΉ - μ΄λ yield()λ₯Ό νΈμΆν΄μ λ¨μ μκ°μ while
- μ°λ λκ° μ€νμ λ©μΆκ² ν μνμμ whileμ΄ λ°λ³΅λλ€λ©΄
join() - λ€λ₯Έ μ°λ λμ μμ μ κΈ°λ€λ¦°λ€.
- μ°λ λ μμ μ νλ μμ μ μ μ λ©μΆκ³ λ€λ₯Έ μ°λ λκ° μ§μ λ μκ° λμ μμ μ μννλλ‘ ν λ join()μ μ¬μ©
- μκ°μ μ§μ ν μ μκ³ μ§μ νμ§ μμΌλ©΄ ν΄λΉ μ°λ λκ° λͺ¨λ λ§μΉ λκΉμ§ κΈ°λ€λ¦Ό
- join()λ interrupt()μ μν΄ λ²μ΄λ μ μμ
- sleep()κ³Ό λ€λ₯Έ μ μ νμ¬ μ°λ λκ° μλ νΉμ μ°λ λμ λν΄ λμ
9. μ°λ λμ λκΈ°ν
- λ©ν°μ°λ λ νλ‘μΈμ€λ μ¬λ¬ μ°λ λκ° κ°μ νλ‘μΈμ€ λ΄μ μμμ 곡μ ν΄μ μμ
- μλ‘μ μμ μ μν₯μ μ€
- μμ νλ 곡μ λ°μ΄ν°λ₯Ό λ€λ₯Έ μ°λ λκ° λ³κ²½νλ©΄ μλν κ²κ³Ό λ€λ₯Έ κ²°κ³Όκ° λμ¬ μλ μμ
- λ€λ₯Έ μ°λ λμκ² λ°©ν΄λ°μ§ μλλ‘ λμ¨ κ²μ΄
μκ³ μμ(critical section)
,λ½(lock)
- 곡μ λ°μ΄ν°λ₯Ό μ¬μ©νλ μ½λ μμμ μκ³ μμμΌλ‘ μ§μ
- λ½μ νλν λ¨ νλμ μ°λ λλ§ μκ³ μμ λ΄μ μ½λλ₯Ό μνν μ μκ² ν¨
- μ΄λ κ² λ€λ₯Έ μ°λ λκ° μμ μ κ°μμ λͺ» νκ² νλ κ²μ μ°λ λμ λκΈ°ν(synchronization)μ΄λΌκ³ λΆλ¦
9.1 synchronizedλ₯Ό μ΄μ©ν λκΈ°ν
- λκΈ°νμ λ κ°μ§ λ°©μ
- λ©μλ μ 체λ₯Ό μκ³ μμμΌλ‘ μ§μ
- νΉμ ν μμμ μκ³ μμμΌλ‘ μ§μ (μ΄λμ λΈλμ synchronized λΈλμ΄λΌκ³ λΆλ¦)
- λ λ€ lockμ μ»μ΄μΌ μ κ·Ό κ°λ₯νκ³ λ²μ΄λ μ lockμ λ°λ©νλ€.
- λͺ¨λ κ°μ²΄λ lockμ νλμ© κ°μ§κ³ μλ€.
- λ©μλ μ 체μ lockλ³΄λ¨ λΈλ λ¨μλ³λ‘ μκ³ μμμ μ΅μννλ κ²μ΄ ν¨μ¨μ
- λκΈ°νμ λ€μ΄κ°λ λ³μλ€μ privateλ‘ μ€μ ν κ² (privateμ΄ μλλ©΄ λκΈ°νλ₯Ό ν΄λ κ°μ λ³κ²½μ λ§μ λ°©λ²μ΄ μλ€.)
9.2 wait()κ³Ό notify()
- wait()
- λκΈ°νλ μκ³ μμμ μ½λλ₯Ό μννλ€κ° λ μ΄μ μμ μ μ§νν μν©μ΄ μλλ©΄ wait() νΈμΆ ν λ½μ λ°λ©νκ³ μ°λ λλ₯Ό κΈ°λ€λ¦¬κ² νλ€.
- 맀κ°λ³μλ₯Ό λ£μΌλ©΄ μ§μ λ μκ° λμλ§ κΈ°λ€λ¦Ό
- 맀κ°λ³μκ° μμ μ notify()κ° νΈμΆλ λκΉμ§ κΈ°λ€λ¦Ό
- notify()
- κΈ°λ€λ¦¬κ³ μλ μ°λ λλ€μκ² ν΅μ§λ₯Ό νμ¬ λ½μ μ»μ΄ μμ μ μ§νν μ μκ² νλ€.
- μ°λ λλ€μ κ°μ²΄μ λκΈ°μ€(waiting pool)μμ ν΅μ§λ₯Ό κΈ°λ€λ¦°λ€.
- ν΄λΉ κ°μ²΄μ λκΈ°μ€μ μλ λͺ¨λ μ°λ λ μ€μμ μμμ μ°λ λλ§ ν΅μ§λ₯Ό λ°μ
- notifyAll()μ κΈ°λ€λ¦¬κ³ μλ λͺ¨λ μ°λ λλ€(νΈμΆλ κ°μ²΄μ waiting poolμ μλ)μκ² ν΅λ³΄, νμ§λ§ lcokμ μ»μ μ μλ μ°λ λλ λ¨ νλ
- wait(), notify()λ Object ν΄λμ€μ μ μ (νΉμ κ°μ²΄μ λν κ²μ΄λ―λ‘)
κΈ°μ νμκ³Ό κ²½μ μν
- ν μ°λ λκ° κ³μ ν΅μ§λ₯Ό λ°μ§ λͺ»νκ³ μ€λ«λμ κΈ°λ€λ¦¬κ² λλ νμμ
κΈ°μ(starvation) νμ
μ΄λΌκ³ ν¨ - notify() λμ notifyAll()μ μ¬μ©ν΄μ λ§μ μ μμ
- μ¬λ¬ μ°λ λκ° ν΅μ§λ₯Ό λ°μμ lockμ λν΄ κ²½μνλ μνλ₯Ό
κ²½μ μν(race condtion)
- κ²½μ μνλ₯Ό κ°μ νκΈ° μν΄ μ°λ λλ₯Ό ꡬλ³ν΄μ ν΅μ§ν΄μΌ ν¨ (Lockκ³Ό Condition μ΄μ©)
9.3 Lockκ³Ό Conditionμ μ΄μ©ν λκΈ°ν
- synchronized λΈλ μΈμλ java.util.concurrent.locks ν¨ν€μ§μ lcok ν΄λμ€λ€μ μ΄μ©
- JDK 1.5μμ μΆκ°
- ReentrantLock : μ¬μ§μ
μ΄ κ°λ₯ν lock. κ°μ₯ μΌλ°μ μΈ λ°°ν lock
- μ¬μ§μ μ lockμ νΌ λ€ μΆνμ λ€μ lockμ μ»μ΄ μ κ·Όμ μλ―Έ
- ReentrantReadWriteLock : μ½κΈ°μλ 곡μ μ , μ°κΈ°μλ λ°°νμ μΈ lock
- μ½κΈ° lockκ³Ό μ°κΈ° lockμ μ 곡
- μ½κΈ° lockμ μ€λ³΅ν΄μ κ±Έκ³ μ½κΈ° μν κ°λ₯
- μ½κΈ° lockμ΄ κ±Έλ¦° μνμμ μ°κΈ° lockμ κ±°λ κ²μ νμ© X (λ°λλ νμ© X)
- StampedLock : ReentrantLockμ λκ΄μ μΈ lockμ κΈ°λ₯μ μΆκ°
- lockμ κ±Έκ±°λ ν΄μ§ν λ μ€ν¬νλ₯Ό μ¬μ©
- μ€ν¬νλ longνμ μ μ μ«κ°
- λκ΄μ μ½κΈ° lockμ μ°κΈ° lockμ μν΄ λ°λ‘ νλ¦Ό
- λκ΄μ μ½κΈ°μ μ€ν¨νλ©΄ μ½κΈ° lockμ μ»μ΄μ λ€μ μ½μ΄ μμΌ ν¨ (무쑰건 μ½κΈ° lockμ κ±Έμ§ μκ³ μ°κΈ°μ μ½κΈ°κ° μΆ©λν λλ§ μ°κΈ°κ° λλ νμ μ½κΈ° lockμ κ±Έμ)
ReentrantLockμ μμ±μ
- μ’
λ₯
- ReentrantLock()
- ReentrantLock(boolean fair)
- μμ±μμ 맀κ°λ³μλ₯Ό trueλ‘ μ£Όλ©΄ lockμ΄ νλ Έμ λ κ°μ₯ μ€λ κΈ°λ€λ¦° μ°λ λκ° lockμ νλ
- μ΄λ€ μ°λ λκ° μ€λ κΈ°λ€λ Έλμ§ μ°μ° νμνλ―λ‘ μ±λ₯ λ¨μ΄μ§
- λλΆλΆ 곡μ ν¨λ³΄λ€ μ±λ₯μ μ ν
- synchronizedμ λ¬λ¦¬ lock ν΄λμ€λ€μ μλμΌλ‘ lockμ μ κ·Έκ³ ν΄μ ν΄μΌ ν¨ (λΉΌλ¨Ήμ§ μλλ‘ μ£Όμ)
- void lock() : lockμ μ κΈ
- void unlock() : lockμ ν΄μ§
- boolean isLocked() : lockμ΄ μ κ²Όλμ§ νμΈ
- μμΈ λ°μ λ° return λ¬ΈμΌλ‘ λΉ μ Έλκ° μ μμΌλ―λ‘ try-finally λ¬ΈμΌλ‘ κ°μΈλ κ²μ΄ μΌλ°μ
- tryLock : λ€λ₯Έ μ°λ λμ μν΄ lockμ΄ κ±Έλ € μμΌλ©΄ lockμ μ»μΌλ €κ³ κΈ°λ€λ¦¬μ§ μκ±°λ μ§μ λ μκ°λ§νΌλ§ κΈ°λ€λ¦Ό
- interrupt()μ μν΄ μμ μ΄ μ·¨μλ μ μλλ‘ μμ±λ¨ (InterruptedException λ°μ κ°λ₯)
ReentrantLockκ³Ό Condition
- κ° μ°λ λλ₯Ό μν Conditionμ λ§λ€μ΄μ κ°κ°μ wating poolμμ λ°λ‘ κΈ°λ€λ¦¬λλ‘ ν μ μμ
- Condotionμ μ΄λ―Έ μμ±λ lockμΌλ‘λΆν° newCondition()μ νΈμΆν΄μ μμ±
- κ·Έ ν await() & signal()μ μ¬μ©νλ©΄ λ¨
- λμμ λͺ νν ꡬλΆν μ μμ
9.4 volatile
- λ©ν° μ½μ΄ νλ‘μΈμμμλ μ½μ΄λ§λ€ λ³λμ μΊμλ₯Ό κ°μ§κ³ μμ
- μ½μ΄λ λ©λͺ¨λ¦¬μμ μ½μ΄μ¨ κ°μ μΊμμ μ μ₯νκ³ μΊμμμ κ°μ μ½μ΄μ μμ
- μΊμμ μ μ₯λ κ°μ΄ κ°±μ λμ§ μμμ λ©λͺ¨λ¦¬μ μ μ₯λ κ°μ΄ λ€λ₯Έ κ²½μ° λ°μ
- μ΄λ volatileμ λ³μ μμ λΆμ΄λ©΄ μΊμκ° μλ λ©λͺ¨λ¦¬μμ μ½μ΄κ° κ°μ μ½μ΄μ΄
- volatileμ λΆμ΄λ λμ μ synchronized λΈλμ μ¬μ©ν΄λ κ°μ ν¨κ³Ό
- μ°λ λκ° synchronized λΈλμΌλ‘ λ€μ΄κ° λμ λμ¬ λ μΊμμ λ©λͺ¨λ¦¬ κ°μ λκΈ°νκ° μ΄λ£¨μ΄μ§κΈ° λλ¬Έ
volatileλ‘ longκ³Ό doubleμ μμν
- JVMμ΄ λ°μ΄ν°λ₯Ό ν λ²μ μ²λ¦¬νλ μ΅μ λ¨μλ 4byte
- 4byteλ³΄λ€ ν° longκ³Ό double νμ (8byte)λ λ³μλ₯Ό μ½λ κ³Όμ μ λ€λ₯Έ μ°λ λκ° λΌμ΄λ€ μ¬μ§κ° μμ (νλμ λͺ λ Ήμ΄λ‘ κ°μ μ°κ±°λ μ½μ μ μμΌλ―λ‘)
- λ³μλ₯Ό μ μΈν λ volatileμ λΆμ΄λ©΄ μ΄λ¬ν λ¬Έμ ν΄κ²°
- volatileλ ν΄λΉ λ³μμ λν μ½κΈ°, μ°κΈ°λ₯Ό μμν
- μμλ λ³νμ§ μλ κ°μ΄λ―λ‘ tread-safeμμΌλ‘ volatileμ λΆμΌ νμκ° μκ³ λΆμΌ μλ μμ
- λ³μμ μ½κΈ°λ μ°κΈ°λ₯Ό μμνν λΏ λκΈ°νκ° μλλΌλ μ μ μ£Όμ(νμν λ©μλλ λΈλμ λκΈ°νλ₯Ό ν΄μΌ νλ€.)
9.5 fork & join νλ μμ
- λ©ν° μ½μ΄λ₯Ό μ νμ©ν μ μλ λ©ν° μ°λ λ νλ‘κ·Έλλ°μ΄ μ€μν΄μ§
- JDK 1.7λΆν° fork & join νλ μμμ μΆκ°
- νλμ μμ μ μμ λ¨μλ‘ λλ μ μ¬λ¬ μ°λ λμμ λμμ μ²λ¦¬νλ κ²μ μ½κ² λ§λ€μ΄μ€
- λ ν΄λμ€ μ€ νλλ₯Ό μμλ°μμ ꡬν
- RecursiveAction : λ°νκ°μ΄ μλ μμ ꡬν
- RecursiveTask : λ°νκ°μ΄ μλ μμ μ ꡬν
- compute() μΆμ λ©μλλ₯Ό ꡬνν΄μΌ ν¨
- run()κ³Ό start()μ κ΄κ³μ²λΌ invoke()λ‘ νΈμΆμ ν΄μΌ μμ μ μ€ν
- fork & join νλ μμμμ μ 곡νλ ForkJoinPoolμ΄λΌλ μ°λ λνμμ μ°λ λλ₯Ό μ¬μ©
- μ§μ λ μμ μ°λ λλ₯Ό 미리 μμ±ν λ€ λ°λ³΅ν΄μ μ¬μ¬μ© κ°λ₯
- λ°λ³΅ μμ± μ΅μ , μ λΉν μ°λ λ μμ± (μ±λ₯μ μ νμν¬ μ λλ‘ μ°λ λλ₯Ό λ§λ€μ§ μμ)
- κ° μ°λ λλ μμ μ μμ νμ λ΄κΈ΄ μμ μμλλ‘ μ²λ¦¬
λ€λ₯Έ μ°λ λμ μμ νμ³ μ€κΈ°
- μμ μ μμ νκ° λΉμ΄μλ μ°λ λλ λ€λ₯Έ μ°λ λμ μμ νμμ μμ μ κ°μ Έμμ μν
- μ°λ λνμ μν΄ μλμ μΌλ‘ μ΄λ£¨μ΄μ§
- μ¬λ¬ μ°λ λκ° κ³¨κ³ λ£¨ μμ μ λλμ΄ μ²λ¦¬
fork()μ join()
- fork() : ν΄λΉ μμ
μ μ°λ λ νμ μμ
νμ λ£λ λΉλκΈ° λ©μλ
- λΉλκΈ° λ©μλλ λ€λ₯Έ μ°λ λμκ² μμ μ μννλλ‘ μ§μλ§ νκ³ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬μ§ μμ
- join() : ν΄λΉ μμ μ μνμ΄ λλ λκΉμ§ κΈ°λ€λ Έλ€κ° μνμ΄ λλλ©΄ κ²°κ³Όλ₯Ό λ°ννλ λκΈ° λ©μλ
'Java > Javaμ μ μ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Chapter 15 - μ μΆλ ₯ I/O (0) | 2022.05.19 |
---|---|
Chapter 14 - λλ€μ μ€νΈλ¦Ό (0) | 2022.05.17 |
Chapter 12 - μ λ€λ¦μ€, μ΄κ±°ν, μ λν μ΄μ (0) | 2022.05.09 |
Chapter 11 - 컬λ μ νλ μμ (0) | 2022.05.05 |
Chapter 10 - λ μ§μ μκ° & νμν (0) | 2022.04.28 |