thread
Thread
μ°λ λλΌλ κ°λ
μ μ΄ν΄νκΈ° μν΄μλ νλ‘μΈμ€
μ λ³νμ±(Concurrency)
μ κ°λ
μ μλ©΄ λ μ’μ κ²κ°λ€.
νλ‘μΈμ€
νλ‘μΈμ€μ μ¬μ μ μλ―Έλ μ»΄ν¨ν°μμ μ€νλκ³ μλ μ»΄ν¨ν° νλ‘κ·Έλ¨μ λ§νλ€. μ¬λ¬ κ°μ νλ‘μΈμλ₯Ό μ¬μ©νλ κ²μ λ©ν° νλ‘μΈμ±
μ΄λΌκ³ νλ©°, κ°μ μκ°μ μ¬λ¬ κ°μ νλ‘κ·Έλ¨μ λμ°λ μλΆν λ°©μμ λ©ν°νμ€νΉ μ΄λΌκ³ νλ€.
νΉμ§
νλ‘κ·Έλ¨μ΄ μ€νλλ λ¨μ
λͺ¨λ νλ‘κ·Έλ¨μ μ€ν λ λ νλ μ΄μμ νλ‘μΈμ€λ₯Ό κ°λλ€.
κ° νλ‘μΈμ€λ λ€λ₯Έ νλ‘μΈμ€μ λ³μλ μλ£ κ΅¬μ‘°μ μ κ·Όν μ μλ€.
κ° νλ‘μΈμ€λ λ³λμ μ£Όμ곡κ°μμ μ€νλλ€.
μ»΄ν¨ν° λ©λͺ¨λ¦¬μ μ μ¬λμ΄ μ€νλμ΄ μλ νλ‘κ·Έλ¨μ λ§νλ€.
νλ‘μΈμ€μ μνλ μμ±, μ€ν, μ€λΉ, λκΈ°, μ’ λ£κ° μλ€.
λ³νμ± (Concurrency) == λμμ±
λ³λ ¬μ±
κ³Ό ν·κ°λ¦΄ μ μλλ° λ³νμ±μ λμμ μ€νλλ κ² μ²λΌ 보μ΄λ κ²
μΌλ‘ μ±κΈμ½μ΄μμλ μλΆν κΈ°λ²
μΌλ‘ μνν μ μκ³ λ©ν°μ½μ΄μμλ 물리μ μΌλ‘ λ³λ ¬λ‘ λμν μ μλ€.
λ³λ ¬μ±(Parallelism)
μ μ€μ λ‘ λμμ μμ
μ΄ μ²λ¦¬λλ κ²
μΌλ‘ λ©ν°μ½μμμλ§ λμμ΄ κ°λ₯νλ€.
μ°λ λ
νλ‘μΈμ€μ νΉμ ν μν κ²½λ‘λ‘ νλ‘μΈμ€κ° ν λΉ λ°μ μμμ μ΄μ©νλ μ€νμ λ¨μλΌκ³ ν μ μλ€.
νλμ νλ‘μΈμ€μμ μ¬λ¬κ°μ μ€λ λλ₯Ό μ¬μ©νλ κ²μ λ©ν° μ€λ λ©
μ΄λΌκ³ νλ€.
νΉμ§
νλ‘μΈμ€ λ΄μμ μ€ν/λ μ§μ€ν°λ§ κ°κ° ν λΉ λ°κ³ λλ¨Έμ§ λ©λͺ¨λ¦¬ μμμ 곡μ νλ€. μ€νμ κ°κ° ν λΉνλ μ΄μ : μ€λ λλ ν κΈ°λ₯μ μννλ λ 립μ μΈ λ¨μλ‘μ¨ μ΅μνμ λ©λͺ¨λ¦¬ μμ(μ€ν)μ κ°κ° ν λΉν΄μΌ λ 립μ μΌλ‘ μνμ΄ κ°λ₯νλ€.
Thread ν΄λμ€μ Runnable μΈν°νμ΄μ€
μλ°μμ μ°λ λλ₯Ό μμ±νλ λ°©λ²μλ Thread ν΄λμ€
μ Runnable μΈν°νμ΄μ€
λ₯Ό μ¬μ©νλ λκ°μ§ λ°©λ²μ΄ μλ€.
Thread ν΄λμ€ extends
Thread ν΄λμ€λ₯Ό νμ₯νμ¬ μμ±νλ λ°©λ²μΌλ‘λ threadν΄λμ€λ₯Ό μμλ°μ μμ±νλ λ°©λ²μΈ th1
κ³Ό th2
μ κ°μ΄ μ΅λͺ
κ°μ²΄λ₯Ό μ¬μ©νμ¬ μμ±νλ λ°©λ² 2κ°μ§ κ° μ‘΄μ¬νκ³ λλ²μ§Έλ°©λ²μΈ μ΅λͺ
ν΄λμ€
λ₯Ό μ΄μ©νλ λ°©λ²μ μ°λ λκ° μ€μ§ νλ²λ§ μν λ λ μ¬μ©νλ λ°©λ²μ΄λ€.
Runnable μΈν°νμ΄μ€ implements
Runnable μΈν°νμ΄μ€λ₯Ό μ΄μ©ν Threadμμ±λ°©λ²λ λκ°μ§κ° μ‘΄μ¬νλ€.
Runnalbe μΈν°νμ΄μ€λ₯Ό implementsν classλ₯Ό μμ±μ 맀κ°λ³μλ‘ μ΄μ©νμ¬ μμ±νλ λ°©λ²
Runnable μΈν°νμ΄μ€λ runλ©μλλ°μ μ‘΄μ¬νμ§ μλ μ μ μ΄μ©νμ¬
λλ€
λ₯Ό μ΄μ©ν΄ λ°λ‘ runλ©μλλ₯Ό μ μνμ¬ μμ±νλ λ°©λ²
μ°¨μ΄μ
Thread ν΄λμ€λ₯Ό extendsνλ λ°©λ²μ classλ₯Ό μμλ°λ κ²μΈ λ§νΌ Threadμ λ€λ₯Έ λ©μλλ€μ μ΄μ©μ΄ κ°λ₯νμ§λ§ λ€λ₯Έ classλ₯Ό μμλ°μ§ λͺ»νμ§λ§, Runnable μΈν°νμ΄μ€λ₯Ό ꡬννλ κ²μ λ€λ₯Έ classλ₯Ό μμλ°μ μ μκ³ μ‘°κΈ λ
κ°μ²΄ μ§ν₯μ
μ΄λ€.Threadν΄λμ€λ₯Ό μμλ°λ classλ run λ©μλκ° μ’ λ£λλ©΄ κ°λΉμ§ 컬λ μ μ΄ λκΈ° λλ¬Έμ μ¬μ¬μ©μ΄ λΆκ°λ₯νμ§λ§, Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν λ°©λ²μ Thread ν΄λμ€λ κ°λΉμ§ 컬λμ μ΄ λλλΌλ ꡬν체λ κ°λΉμ§ 컬λμ μ΄ λμ§ μκΈ° λλ¬Έμ μ¬μ¬μ©μ΄ κ°λ₯νλ€.
Runnable μΈν°νμ΄μ€λ₯Ό ꡬνν κ²½μ° Threadν΄λμ€μ λ©μλλ₯Ό μ΄μ©νκ³ μΆλ€λ©΄ Thread ν΄λμ€μ static λ©μλμΈ currentThread()λ₯Ό νΈμΆνμ¬ μ°λ λμ μ°Έμ‘°λ₯Ό μ»μ΄μΌ μ¬μ©μ΄ κ°λ₯νλ€.
μ°λ λμ μν
κ°μ²΄ μμ±
NEW
μ€λ λ κ°μ²΄ μμ± (start()λ©μλ νΈμΆ μ )
μ€ν λκΈ°
RUNNABLE
μ€μΌμ€λ§ λμ§ μμ μ€νμ κΈ°λ€λ¦¬κ³ μλ μν
μΌμμ μ§
WAITING
λ€λ₯Έ μ€λ λμ notifyλ₯Ό κΈ°λ€λ¦¬λ μν
μΌμμ μ§
TIMED_WAITING
μ£Όμ΄μ§ μκ° λμ κΈ°λ€λ¦¬λ μν
μΌμμ μ§
BLOCKED
μ¬μ©νκ³ μ νλ κ°μ²΄μ λ½μ΄ ν릴 λ κΉμ§ κΈ°λ€λ¦¬λ μν ( λκΈ°ν λ¬Έμ )
μ’ λ£
TERMINATED
μ€νμ λ§μΉ μν
Startμ run
start()λ NEWμνμ μ€λ λλ₯Ό RUNNABLEμνλ‘ λ§λ€μ΄μ£Όλ λ©μλλ‘ μ€νλ μ μλ λκΈ° νμ λ£μ΄μ£Όλ μν (call stack μμ±)
run()μ μ€λ λκ° μ€μΌμ€λ¬μ μν΄ μ€μ λ‘ μ€νλ λ μ€νν λ©μλμ΄κ³ start()μμ΄ runλ§ μ€ννκ² λλ€λ©΄ overrideλ λ©μλλ₯Ό κ·Έλλ‘ νΈμΆν λΏ ν΄λΉ Threadλ RUNNABLEμνκ° μλκΈ° λλ¬Έμ λ©νλ°μ΄ν°
κ° μ€νλκΈ° ν
μ λ€μ΄μμ§ μμ μνλ λλ‘ λμνμ§ μλλ€.
μ°λ λ μν μ μ΄ λ©μλ
Thread ν΄λμ€μ μ μ
interrupt()
μΌμμ μ§μνμ μ€λ λμμ Interrupt μμΈλ₯Ό λ°μμμΌ μμ μ λ©μΆλΌκ³ μμ²νλ λ©μλ
interrupted()
interrupt()κ° νΈμΆλμλμ§ μλ €μ£Όλ λ©μλ (λμλ€λ©΄ true)
join((long millis),(int nanos))
λμμ€μΈ μμ μ λ©μΆκ³ λ€λ₯Έ μ€λ λκ° μ§μ μκ°λμ μμ μννλλ‘ λ겨주λ λ©μλλ‘ μκ°μ μ§μ νμ§ μμΌλ©΄ λ€λ₯Έ μ€λ λκ° μμ μ λ§μΉ λ κΉμ§ κΈ°λ€λ¦°λ€.
sleep(long millis, (int nonos))
μΌμ μκ°λμ μ€λ λλ₯Ό λ©μΆκ² νλ λ©μλλ‘ μΌμμ μ§
μνλ‘ λ§λ€κ³ interrupt()
κ° νΈμΆλλ©΄ μ€ν λκΈ°
μνλ‘ λ§λ λ€.
sleepμ νμ μ€νμ€μΈ μ€λ λ
μ λν΄ μλνκΈ° λλ¬Έμ staticμΌλ‘ μ μΈλμ΄ μμ΄ Thread.sleep(1000)
κ³Ό κ°μ΄ μ¬μ©ν΄μΌ νλ€.
yield()
μ€λ λ μμ μκ² μ£Όμ΄μ§ μκ°μ λ€μ μ€λ λμκ² μ보νλ λ©μλ
Object ν΄λμ€μ μ μ
νΉμ κ°μ²΄μ λν κ²μ΄λ―λ‘ μμ λ©μλλ‘Έ λ€λ₯΄κ² Objectν΄λμ€μ μ μλμ΄ μμ΄ λͺ¨λ κ°μ²΄μμ νΈμΆμ΄ κ°λ₯νκ³ λκΈ°ν λΈλ‘
λ΄μμλ§ μ¬μ©ν μ μλ€.
notify()
μΌμμ μ§ μνμ μ€λ λμ€ λ€λ₯Έ μ€λ λλ₯Ό κΉ¨μ°λ λ©μλλ‘ RUNNABLEμνλ‘ λ§λ λ€.
notifyAll()
waiting pool
μμ μλ λͺ¨λ μ€λ λλ₯Ό κΉ¨μ°λ λ©μλλ‘ κΉ¨μ΄λ μ€λ λλ€μ λ€μ κ²½μμ ν΅ν΄ μ€νλλ€.
νΈμΆλ κ°μ²΄μ waiting poolλ΄μ μ€λ λλ€μ λͺ¨λ κΉ¨μ°λ κ²
wait()
notify()λ notifyAll()μ κΈ°λ€λ¦¬λ λ©μλ
wait(long timeout,(int nanos))
μ§μ λ μκ°λμλ§ κΈ°λ€λ¦¬λ λ©μλ
μ°λ λμ μ°μ μμ
μ¬λ¬κ°μ μ°λ λκ° λμνλ©° λ³νμ±μ μννκΈ° μν΄ μλΆν μ νμ¬ μ€μΌμ€λ§μ ν΅ν΄ μ€λ λλ₯Ό λμ μν€λλ° μ΄λ₯Ό μν΄, μλ°λ μ°λ λ ν΄λμ€μ μ΄λ€ μ°λ λλ₯Ό λ μ€μνκ²
μκ°νμ¬ λμμν¬μ§ μ§μ νμ¬ λ λ§μ μμ
μκ°
μ κ°λλ‘ ν μ μκ² ν΄μ£Όλ λ©€λ² λ³μ
λ₯Ό κ°κ³ μλ€.
μ°μ μμμ λ²μλ 1~10
μ΄λ©° μ«μκ° λμμλ‘ μ°μ μμκ° λκ³ , λ©μΈ λ©μλλ₯Ό μννλ μ°λ λμ μ°μ μμκ° 5μ΄λ―λ‘ mainλ©μλ λ΄μμ μμ±νλ μ°λ λμ μ°μ μμλ κΈ°λ³Έκ°μ΄ 5κ° λλ€.
μ°λ λμ μ°μ μμλ μλμ
μΈ κ°μΌλ‘ μ λμ μ΄ κ°μ΄ μλλ€
λ©μλ
μνν λΉ (Round Robin) λ°©μ
μ€μΌμ€λ§ λ°©μμλ μ°μ μμλ°©μ λ§κ³ λ RRλ°©μλ μλλ° μ΄ λ°©μμ μ€λ λλ§λ€ μ¬μ©ν μκ°μ ν λΉ(Time slice)ν΄μ μ ν΄μ§ μκ°λ§νΌ λμκ°λ©° μ€ννλ λ°©μμΌλ‘ JVM
μ μν΄ κ²°μ λκΈ° λλ¬Έμ κ°λ°μκ° μμλ‘ μμ ν μ μλ€.
Main μ°λ λ
μ°λ¦¬κ° μλ°νλ‘μ νΈλ₯Ό μ²μ μμνμλλ c,c++μ κ°μ΄ μ²μ μμ±νλ main()
λ©μλλ₯Ό μ€ννλ©΄ μμλλ μ€λ λλ‘ mainλ©μλμ μ½λ νλ¦
μ΄λ€.
main μ°λ λλ₯Ό ν΅ν΄ λ€λ₯Έ μ°λ λλ₯Ό μμ±νκΈ° λλ¬Έμ λ©μΈμ€λ λκ° μλ€λ©΄ λ©ν°μ€λ λλ λΉμ°ν ꡬνν μ μλ€.
single process single thread
single process multi thread
multi process single thread
multi process multi thread
λκΈ°ν
λ©ν° μ€λ λλ‘ λμνλ νλ‘κ·Έλ¨μμ ν μ€λ λκ° μμ νλ μ€μ μ¬μ©νλ λ°μ΄ν°λ€μ λ€λ₯Έ μ€λ λκ° κ°μνμ§ λͺ»νλλ‘ λ§λ κ²μ΄λ€.
λκΈ°νλ₯Ό μν€μ§ μλλ€λ©΄ μ¬λ¬κ°μ μ€λ λκ° λ²κ°μκ°λ©° λμν κ²½μ°, μ΄λ€ μ€λ λκ° λ¨Όμ μ€νλ μ§ μ μ μκΈ° λλ¬Έμ κ°λ°μκ° μλνμ§ μλ λμμ΄ λ°μν μ μκΈ° λλ¬Έμ λ©ν°μ€λ λνλ‘κ·Έλλ°μμλ μ€μν λ¬Έμ μ΄λ€.
μ£Όμ κ°λ λ€
μκ³ κ΅¬μ (Critical Section) : μ¬λ¬κ°μ μ€λ λκ° κ³΅μ νλ λ°μ΄ν° λΈλμΌλ‘ νλμ μ€λ λλ§ μ κ·Όκ°λ₯νλλ‘ μ§μ νλ κ²μ΄ λͺ©νμ΄λ€.
μνΈ λ°°μ (Mutual Exclusion,Mutex) : μκ³ κ΅¬μμ ν μμ μμ νκ°μ μ€λ λλ§ μ¬μ©ν μ μλλ‘ λ€λ₯Έ μ€λ λμ μ κ·Όμ μ μ΄νλ κΈ°λ²
λκΈ°ν : μνΈλ°°μ μ ν ννλ‘ μνΈλ°°μ λ₯Ό μννκΈ° μν΄ νλ‘μΈμ€μ μ²λ¦¬ μμλ₯Ό κ²°μ νλ κΈ°λ² (Semaphore)
κΈ°μ μν (starvation) : λ€λ₯Έ μ°λ λμκ² μ°μ μμκ° λ°λ € μμμ κ³μ ν λΉλ°μ§ λͺ»νλ μν
곡μ μ±(fairness) : λͺ¨λ μ°λ λκ° κ³΅ννκ² μμ μ μννλ κ²
Synchronized μ΄μ©
μκ³μμμ μ€μ νλλ° μ¬μ©νλ ν€μλλ‘ λ©μλ μ 체λ₯Ό μκ³μμμΌλ‘ μ§μ νκ±°λ νΉμ ν μμμ μκ³μμμΌλ‘ μ§μ νλ λ°©λ²μ΄ μλ€.
μ°λ λλ synchronizedκ° νΈμΆλ μμ λΆν° ν΄λΉ μ½λλΈλμ΄ ν¬ν¨λ κ°μ²΄μ lockμ μ»μ΄ μμ μ μννλ€κ° μ’ λ£λλ©΄ lockμ΄ λ°νλκ³ μ΄λ λͺ¨λ μλμΌλ‘ μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ, κ°λ°μλ μκ³μμλ§ μ€μ ν΄μ£Όλ©΄λλ€.
κ°μ²΄λ lockμ νλμ© κ°μ§κ³ μκ³ μ€μ ν κ°μ²΄μ lockμ κ°μ§κ³ μλ μ°λ λλ§ μκ³μμμ μ κ·Όμ΄ κ°λ₯νκ³ λ€λ₯Έ μ€λ λλ λκΈ° μνμ λ€μ΄κ°κΈ° λλ¬Έμ μκ³μμμ μ’νλ κ²μ΄ μ’λ€.
λ©μλμ synchronizedλ₯Ό κ±Έλ©΄ κ·Έ λ©μλκ° ν¬ν¨λ κ°μ²΄(this)μ lockμ κ±°λ κ²κ³Ό κ°λ€.
κ°μ²΄ μμ΄ νΈμΆνλ static λ©μλμ κ²½μ° ν΄λΉ classμ lockμ κ±Έλ©΄μ ν¨μκ°μ lockμ΄ κ³΅μ λμ΄ λμμ νΈμΆλλ κ²μ λ§μ λκΈ°νλ¬Έμ κ° ν΄κ²°λλ€.
Locks
Java 5μ μΆκ°λ ν¨ν€μ§λ‘ java.util.concurrent
κ° μλλ° μ΄ ν¨ν€μ§μμ λκΈ°νλ₯Ό μν΄ λ€μν ν΄λμ€λ€μ μ 곡νλ€.
μ£Όμ κΈ°λ₯
Locks : μνΈ λ°°μ λ₯Ό μ¬μ©ν μ μλ ν΄λμ€
Synchronizers : λκΈ°νλ₯Ό μ²λ¦¬νλ ν΄λμ€ μ 곡 (Semaphore, CountDownLatch, CyclicBarrier, Phaser, Exchanger)
Atomic : λκΈ°νκ° λμ΄μλ λ³μ μ 곡
Executors : μ°λ λ ν μμ±, μ°λ λ μλͺ μ£ΌκΈ° κ΄λ¦¬μ κ°μ κΈ°λ₯ μ 곡
Queue : Thread-safeν Queue μ 곡
java.util.concurrent.locks
ν΄λΉ ν¨ν€μ§μ μνΈ λ°°μ λ₯Ό μν Lock APIλ€μ΄ μ μ΄ λμ΄μκ³ , synchronized λ lockμ μ΄μ©ν λκΈ°νμΈλ§νΌ λμΌν λ©μ»€λμ¦μΌλ‘ λμνλ€.
λ΄λΆμ μΌλ‘ synchronizedλ₯Ό μ¬μ©ν΄ ꡬνλμκ³ , λμ± λ μ μ°νκ³ μ κ΅νκ² μ²λ¦¬νκΈ° μν΄ μ¬μ©λκ³ μ§μ lockμ κ±Έκ³ νΈλ μμ μ μνν΄μΌ νλ€.
Interface
Lock : 곡μ μμμ νλ²μ ν μ°λ λλ§ read/writeλ₯Ό μν κ°λ₯
ReadWriteLock : 곡μ μμμ μ¬λ¬κ°μ μ°λ λκ° readν μ μμ§λ§ writeλ ν μ°λ λλ§ μν κ°λ₯
Condition : wait()κ³Ό notify()λ₯Ό μ°λ λμ μ’ λ₯λ‘ κ΅¬λΆνμ§ μκ³ , 곡μ κ°μ²΄μ waiting pollμ λͺ°μ λ£κ³ κ° μ°λ λλ₯Ό μν Conditionμ λ§λ€μ΄ κ°κ°μ waiting poolμμ λ°λ‘ κΈ°λ€λ¦¬λλ‘ νλ€.
wait(),notify(),notifyAll() λμ await(),signal(),signalAll()μ μ¬μ©νλ€.
Interfaceμ ꡬν체
ReentrantLock : Lockμ ꡬνμ²΄λ‘ μκ³μμμ μμ,μ‘Έλ£ μ§μ μ λͺ μ ν μ μκ² ν΄μ€λ€.
ReentrantReadWriteLock : ReadWriteLockμ ꡬν체
StampLock : JDK 1.8λΆν° μΆκ°λμκ³ , λ€λ₯Έ lockκ³Ό λ¬λ¦¬ LockμΈν°νμ΄μ€λ₯Ό ꡬννμ§ μκ³ lockμ κ±Έκ±°λ ν΄μ§ν λ μ€ν¬ν(longνμ μ μκ°)λ₯Ό μ¬μ©νλ€.
μ£Όμ λ©μλ
lock() : Lock μΈμ€ν΄μ€μ lockμ 건λ€.
lockInterruptibly() : νμ μ°λ λκ° interrupted μνκ° μλλ Lock μΈμ€ν΄μ€μ μ κΈμ κ±Έκ³ interruptedμνλΌλ©΄ Exceptionμ λ°μμν¨λ€.
tryLock() : μ¦μ LockμΈμ€ν΄μ€μ μ κΈμ μλνκ³ μ±κ³΅μ¬λΆλ₯Ό boolean νμ μΌλ‘ λ°ννλ€.
tryLock(long timeout, TimeUnit timeUnit) : μ κΈ μ€ν¨μ falseλ₯Ό λ°ννλ κ²μ΄ μλ μ£Όμ΄μ§ μκ°λμ κΈ°λ€λ¦°λ€.
unlock() : LockμΈμ€ν΄μ€μ μ κΈμ ν΄μ νλ€.
newCondition() : νμ Lock μΈμ€ν΄μ€μ μ°κ²°λ Condition κ°μ²΄λ₯Ό λ°ννλ€.
Synchronized μ Lockμ μ°¨μ΄μ
Synchronized
λ μμμ μΈ(implicit) lock
μ΄λΌκ³ νμ¬ λΆκ³΅μ λ¬Έμ κ° λ°μ ν μ μμ΄ μ°λ λ μμλ₯Ό 보μ₯νμ§ μμ§λ§ Lock
μ μμλ₯Ό μ§μ ν μ μμ΄ λͺ
μμ μΈ(explict) lock
μ΄λΌκ³ νλ€.
Synchronized
λ lockμ μλ νλ/λ°νν΄μ£ΌκΈ° λλ¬Έμ μ½λκ° κ°κ²°νλ€λ μ₯μ
μ΄ μκ³ , Lock
μ ReentrantLockμ μ΄μ©νλ©΄ μμ±μ μΈμλ₯Ό ν΅ν΄ 곡μ /λΆκ³΅μ μ μ€μ ν μ μμ΄ κ³΅μ ν lockμ μ¬μ©ν κ²½μ° μμ ν λΉμ μν΄ κ²½μμ΄ λ°μνμ λ μ€λ κΈ°λ€λ¦° μ€λ λμκ² lockμ μ 곡νμ¬ κΈ°μ λ¬Έμ λ₯Ό ν΄κ²°
ν μ μλ€.
volatile
λ©ν° μ½μ΄ νλ‘μΈμλ μ½μ΄λ§λ€ λ³λμ μΊμλ₯Ό κ°κ³ μλλ° λ³μ μμ volatile
ν€μλλ₯Ό λΆμ΄λ©΄ μ½μ΄κ° λ³μμ κ°μ μ½μ΄μ¬ λ μΊμκ° μλ λ©λͺ¨λ¦¬μμ μ½μ΄μ€κΈ° λλ¬Έμ μΊμμ λ©λͺ¨λ¦¬κ°μ λΆμΌμΉλ₯Ό ν΄κ²°ν μ μλ€.
JVMμ λ°μ΄ν°λ₯Ό 4byte λ¨μλ‘ μ²λ¦¬νκΈ° λλ¬Έμ intλ μ΄λ³΄λ€ μμ νμ μ λ°μ΄ν°λ νλ²μ μ½κ±°λ μ°λ κ²μ΄ κ°λ₯νλ κ·Έλ³΄λ€ ν° λ°μ΄ν° νμ μ΄λΌλ©΄ νλμ λͺ λ Ήμ΄λ‘ κ°μ μ½κ±°λ μΈ μ μλ€. λλ¬Έμ λ³μμ κ°μ μ½λ κ³Όμ μμ λ€λ₯Έ μ°λ λκ° λΌμ΄λ€ νμ΄ μκΈ° λλ¬Έμ λ³μλ₯Ό μ½κ³ μ°λ λ¬Έμ₯μ synchronizedλΈλμΌλ‘ κ°μΈκ±°λ λ³μλ₯Ό volatileμ λΆμ¬ μ μΈνλ λ°©λ²μΌλ‘ μΊμμ λ©λͺ¨λ¦¬κ° λΆμΌμΉ λ¬Έμ λ₯Ό ν΄κ²° ν μ μλ€.
μμμλ volatileλ₯Ό λΆμΌ μ μμ΄ λ³μμ finalμ κ°μ΄ μΈ μ μλ€. (μμλ λ³νμ§ μλ κ°μ΄κΈ° λλ¬Έμ thread-safeνκΈ° λλ¬Έμ)
λ°λλ½
κ΅μ°©μνλΌκ³ λ νλ©° μνΈ λ°°μ μ μν΄ λνλλ λ¬Έμ λ‘, λ μ΄μμ μ€λ λκ° λ°μ΄ν°λ₯Ό μ μ ν μνμμ μλ‘ λ€λ₯Έ μ€λ λκ° μ μ νκ³ μλ λ°μ΄ν°λ₯Ό μꡬνκ²λμ΄ λμμ΄ κΈ°λ€λ¦¬λ μν
λ°μ΄ν°λ² μ΄μ€ νΈλμ μ μμλ λ°μνλλ° ν νΈλμμ μμ ν λ μ½λμ μ λ°μ΄νΈλ₯Ό μνν λ, μ΄ λ μ½λλ μ λ°μ΄νΈλ₯Ό μν΄ λ€λ₯Έ νΈλμμ μ μ κ·Όμ λ§λλ‘ lockμ κ±°λλ° λ€μμ νΈλμ μ μ΄ λμμ λ μ½λλ₯Ό μ λ°μ΄νΈνλ €νλ€λ©΄ λ°λλ½μ λΉ μ§ μνμ΄ μλ€.
λ°λλ½ λ°μ 쑰건(μ΄μ )
Mutual Exclusion(Mutex) : μμμ λμ μ κ·Ό λΆκ°λ₯
Hold & Wait : μ μ νκ³ κΈ°λ€λ¦¬κΈ° (μμμ μ μ νμ±λ‘ λ€λ₯Έ μ€λ λμ μμμ λ°λ©λ°κΈΈ κΈ°λ€λ¦¬λ κ²)
No Preemption : μμμ κ°μ λ‘ λΊμ΄μ€μ§ λͺ»ν¨
Circular Wait : μν ννλ‘ λκΈ°
λ°λλ½ ν΄κ²° λ°©λ²
λ°λλ½ μλ°© : λ°λλ½ λ°μ 쑰건 4κ°μ§λ₯Ό μμ² λ΄μνλ λ°©λ²
λ°λλ½μ ννΌ : μμμ΄ μ΄λ»κ² μμ²λ μ§μ λν μΆκ°μ 보λ₯Ό μ 곡νλλ‘ μꡬνλ κ²μΌλ‘ μμ ν λΉμνλ₯Ό κ²μ¬νλ λ°©λ²
λ°λλ½ νμ§ & ν볡 : λ°λλ½μ΄ λ°μνμλ ν΄κ²°νλ λ°©λ²
λ°λλ½ λ¬΄μ : μμ£Ό μ μ νλ₯ λ‘ λ°λλ½μ΄ λ°μνλ€λ©΄, 무μνλ λ°©λ²
무μνκ±°λ μ¬μ€ννλ νΈμ΄ μμμ μΌλ‘ λ μ΄λμ λ³Ό μλ μκΈ° λλ¬Έμ μννλ λ°©λ²
λ°λλ½ λ°©μ§ λ°©λ²λ€
λ½ μ λ ¬ : λͺ¨λ λ½μ΄ νμ κ°μ μμλ‘ νλλλ€λ©΄ λ°λλ½μ λ°μνμ§ μκΈ° λλ¬Έμ ν¨κ³Όμ μ΄λ λ½μ μμλ₯Ό μκ³ μλ μνμμλ§ μ¬μ©μ΄ κ°λ₯νλ€. (λ°λλ½ μλ°©)
λ½ νμ μμ : λ½μ νλνκΈ° μν΄ κΈ°λ€λ¦¬λ μκ°μ μ ν΄λκ³ μκ°μ΄ μ§λ νμλ λ½μ λ€μ μλνλ λ°©λ² (λ°λλ½ νμ§&ν볡)
κ°μ λ½μ νλνλ €λ λ€λ₯Έ λͺ¨λ μ°λ λμκ² κΈ°νλ₯Ό μ£Όλ κ²μ΄κΈ° λλ¬Έμ 곡μ μ± λ¬Έμ κ° λ°μνκ²λκ³ , λ°λλ½ λΏλ§μ΄ μλ μμ μ μ²λ¦¬μ€μλ νμμμμ΄ λ°μν μ λ μλ€.
λ°λλ½ κ°μ§ : μλ£κ΅¬μ‘°λ₯Ό μ΄μ©νμ¬ μ°λ λκ° λ½μ νλνλ©΄ μ μ₯νκ³ μ΄λ₯Ό μ΄μ©ν΄ λ°λλ½μ κ°μ§νκ³ λ°λλ½μ΄ λ°μνλ€λ©΄, λ½μ ν΄μ νλ λ°©λ²
Atomic Variable : volatile ν€μλλ java.util.concurrent.atomic ν΄λμ€λ₯Ό μ΄μ©νμ¬ μμ λ³μλ₯Ό μ¬μ©νλ λ°©λ²
μ°λ λ ν
μ°λ λλ₯Ό 미리 λ§λ€μ΄ νμν λ μ¬μ©νκ³ λ°λ©ν μ μλλ‘ νλ νμ₯μ κ°λ
java.util.concurrent.Executors
μμ μ€λ λν κ΄λ ¨ APIλ₯Ό μ 곡νλ€.
μ₯μ
μ€λ λλ₯Ό μμ±/μκ±°νλλ° λΉμ©μ΄ μ λ€.
μμ μ΄μ λ‘ λ€μμ μ¬μ©μ μμ²μ μ²λ¦¬ν λ λΉ λ₯΄κ² λμ κ°λ₯νλ€.
λ¨μ
μ¬μ©νλ μλ³΄λ€ λ§μ΄ μμ±ν΄λλ©΄ λ©λͺ¨λ¦¬ λλΉκ° λλ€.
λ Έλ μ€λ λκ° λ°μν μ μλ€.
μ°λ λ νμ ꡬ쑰
Taskμ μμ²μ λ°λ Queue
μ€μ μ°λ λλ₯Ό μμ±νκ³ κ΄λ¦¬νλ manager
Queue μμμ Taskλ₯Ό κΊΌλ΄μ μ€μ μ°λ λμμ λμμμΌ κ²°κ³Όλ₯Ό μ»λ λΆλΆ
μμ± λ©μλ
Executors.newFixedThreadPool(10) : μ΅λ μ°λ λλ₯Ό 10κ°κΉμ§ λ§λλ ν
Executors.newCachedThreadPool() : μ°λ λ μμ μ νμ λμ§ μλ νλ‘ μ°λ λ μμ μμ²μ΄ λ€μ΄μ¬λ μμ±νκ³ μ’ λ£μμ λ°λ‘ μ£½μ§μκ³ μ§§μ μκ°(1λΆ)λμ μ΄μμλ λ°©λ²μ ν
Executors.newSingleThreadExecutor() : νλμ μ°λ λλ₯Ό μμ±νλ νλ‘ μ°λ λ μμ μ€μ μμΈμν©μ΄ λ°μν κ²½μ° μμΈμ²λ¦¬λ₯Ό μν μ°λ λμ©μΌλ‘ λ§μ΄ μ¬μ©νλ€.
Executors.newScheduledThreadPool() : μΌμ μ£ΌκΈ°λ§λ€ λ°λ³΅ν΄μΌνλ μ€λ λλ₯Ό μ¬λ¬κ° μμ±νκΈ° μν ν
μ μ μ€λ λνμ μ¬μ΄μ¦λ μ΄λ»κ² μκΉ?
Reference
https://nesoy.github.io/articles/2018-09/OS-Concurrency-Parallelism
https://ryan-han.com/post/java/java-thread/
https://zbomoon.tistory.com/12
https://widevery.tistory.com/28
https://goscala.tistory.com/171
https://tourspace.tistory.com/54
Last updated