μμ κΈμμ μλ° λμμ± μ μ΄ λ°©μμΈ `synchronized`, `ReentrantLock`, `Semaphore`μ λν΄ μμλ΄€λ€. μ΄ μ€ `ReentrantLock`, `Semaphore` μ μλ°μμ μ 곡νλ κ³ μμ€ λ½ (Explicit Lock)μ΄λ©° OS μμ€μ λͺ¨λν° λ½κ³Όλ 무κ΄νκ² μ체μ μΈ λκΈ° νμ λ½ νλ λ©μ»€λμ¦μ μ¬μ©νμ¬ λμνλ€.
λ°λ©΄μ `synchronized` λ κ°μ²΄κ° κ°μ§κ³ μλ ν€λλ₯Ό μ¬μ©νμ¬ μ μ΄νλ©° JVMμμ κ΄λ¦¬νλ JVM λ΄μ₯ λ½, μ¦ μ μμ€ λ½ (Implicit Lock) μ΄λ€.`synchronized`λ JVM λͺ¨λν° λ½μ κΈ°λ°μΌλ‘ μ±λ₯ μ΅μ νλ₯Ό μν΄ `Biased Locking -> Lightweight Locking -> Heavyweight Locking`μ λ¨κ³μ μΌλ‘ μ μ©νλ€. μ΄μ κ°μ΄ κ²½μ μν©μ λ°λΌ κ°λ²Όμ΄ λ½ λ°©μμμ λͺ¨λν° λ°©μμΌλ‘ μ μ§μ μΌλ‘ μ νλλ κ³Όμ μ μ΄λ² κΈμμ μμΈνκ² λ€λ£° κ²μ΄λ€.
βοΈ κ³΅μ κ°μ²΄
κ°μ²΄λ νμ λ μμμΌλ‘, μμ±λλ©΄ Heap μμμ μ μ₯λλ€. λν μ€λ λλ Stack μμμ μμ±λλλ°, ν΄λΉ μ€λ λλ€μ κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λκ³ μ΄ κ³Όμ μμ λ κ° μ΄μμ μ€λ λκ° νλμ λμΌ κ°μ²΄λ₯Ό μ°Έμ‘°νλ μΌμ΄ λ°μνκ² λλ€. μ΄λ νμν κ°λ μ΄ λκΈ°νμ΄λ€. λκΈ°νλ₯Ό μν΄μλ Lockμ΄ νμνλ° μ΄λ κ°μ²΄μ Object ν€λ λΆλΆμ ν¬ν¨λμ΄ μλ€. κ°μ²΄ ν΄λ μ€ ν΄λΉ κ°μ²΄μ μ¬λ¬κ°μ§ λ©νλ°μ΄ν°(λ½ μν, GC μ 보 λ±)λ₯Ό νμΈν μ μλ λΆλΆμ Mark WordλΌκ³ νλ€.
μ μ¬μ§ μ°μΈ‘μ Mark Wordλ UnLock μνμ΄λ©° μ΄ λ Hash Codeλ κ°μ²΄μ κ³ μ λ²νΈλ₯Ό μλ―Ένλ€. μ΄ μΈμ λΉνΈλ€μ κ²½μ μνμ λ°λΌ λ³κ²½λλλ° μ΄λ μλμμ λ μμΈνκ² μ΄ν΄λ³Ό μμ μ΄λ€.
1οΈβ£ Biased Locking
μλΉμ€ μ νμ λ°λΌ λ€λ₯΄κ² μ§λ§, μΌλ°μ μΌλ‘ κ°μ²΄μ λν΄μ κ²½μμ΄ μΌμ΄λμ§ μλ κ²½μ°κ° λ§μΌλ©°, κ²½μμ΄ μΌμ΄λλλΌλ νΉμ κ°μ²΄μ λμΌν νλμ μ€λ λκ° κ³μν΄μ μ κ·Όνλ κ²½μ°κ° λλΆλΆμ΄λ€. μ΄ λ λμΌν μ€λ λμ λν λ°λ³΅μ μΈ λκΈ°ν μμ μ CPUμ λλΉλ‘ μ΄μ΄μ§κΈ° λλ¬Έμ Mark Wordλ₯Ό νΉμ μ€λ λ μ μ© Mark Wordλ‘ λ³ννλλ° μ΄λ₯Ό Biased Lockingμ΄λΌκ³ νλ€.
κ·Έλ¦Όκ³Ό κ°μ΄ Hash CodeλΆλΆμ μ κ·Όνλ μ€λ λμ IDλ‘, Biasedμ λΉνΈλ 1λ‘ λ°λκ² λλ€.
μ΄νμ λμΌν μ€λ λκ° ν΄λΉ κ°μ²΄μ λ€μ νλ² μ κ·Όνλ€λ©΄ μ€λ λ ID κ°μ λΉκ΅λ₯Ό ν΅ν΄ μ½κ² Lockμ νλν μ μλ κ²μ΄λ€.
2οΈβ£ Lightweight Locking
μ¬μ ν κ²½μμ΄ μ¬νμ§ μμ λ μ¬μ©λλ λ½ λ°©μμΌλ‘, 곡μ κ°μ²΄μ λν κ²½μμ΄ μμλμμ λ Biased Lockingμ΄ ν΄μ λκ³ Lightweight Lockingμ΄ μ μ©λλ€. μ΄λ κ°μ²΄μ λ½μ νλν μ€λ λλ κ°μ²΄μ Mark Wordμ κ°μ²΄μ μ£Όμλ₯Ό μμ μ μ€νμμμ μ μ₯ν΄λλλ€. λν κ°μ²΄μ Mark Wordλ Lock Record Addressλ‘ λ³νλλ©° μ΄λ Lock Recordκ° μ μ₯λ μ€λ λμ μ€ν μμμ κ°λ¦¬ν¨λ€. μ΄λ λ― μλ‘λ₯Ό ν¬μΈν νκ³ μλ μνκ° λλ©΄ Lockμ νλν κ²μ΄λ€,
Lightweight Locking μνμμ λ½μ νλνμ§ λͺ»ν μ€λ λλ Spin Lockμ λκ² λλ©°, μ΄λ₯Ό ν΅ν΄ 컨νμ€νΈ μ€μμΉ λΉμ©μ μ κ°ν μ μλ€. μ΄ λ λ‘μ° μ½λ μμ€μμμ μνΈλ°°μ λ₯Ό μν΄ CPU μμ€μ CAS μ°μ°μ΄ μΌμ΄λκ² λλ©° μ΄μ κ°μ μλ¦¬λ‘ μμμ μΈ μ°μ°μ μ¬μ©μ μμ€μμ ν μ μλλ‘ κ΅¬νν΄λμ κ²μ΄ `cocurrent.atomic` ν¨ν€μ§μ΄λ€.
3οΈβ£ Heavyweight Locking
μ€λ λ κ°μ κ²½μμ΄ μ¬νλλ©΄ Lightweight Lockingμ Heavyweight LockingμΌλ‘ λ³νλλ©° μ΄ λλΆν° λͺ¨λν° λ°©μμ μνΈλ°°μ κ° μ¬μ©λλ€. μ€λ λκ° λ½ νλμ μν΄ λκΈ°ν λ λΈλ‘νΉλμ΄, λ½μ ν΄μ ν λκΉμ§ CPUλ₯Ό μ¬μ©νμ§ μκ³ λκΈ°νλ€. λν OS μμ€μ 컨ν μ€νΈ μ€μμΉμ΄ μΌμ΄λκΈ° λλ¬Έμ λΉκ΅μ ν° λΉμ©μ΄ λ°μνλ€.
μ μ¬μ§κ³Ό κ°μ λͺ¨λν° λ°©μμ Non-blocking Monitor λ°©μμ΄λΌκ³ νλ€. μ€λ λλ λͺ¨λν°μ μ§μ νκΈ° μν΄ Wait Setκ³Ό Entry Setμμ λκΈ°νλ€. Wait Setμ 쑰건 λ³μμ ν¨κ» μ¬μ©λμ΄ νΉμ 쑰건μ λ§μ‘±ν λκΉμ§ μ€λ λκ° λκΈ°νλ μ₯μμ΄λ©°, λ€λ₯Έ μ€λ λμ μν΄ κΉ¨μ΄λκ² λλ©΄ Entry SetμΌλ‘ μ΄λνμ¬ λ½μ νλν μ μλ μνκ° λλ€. λν Entry Setμ λ½μ νλνκΈ° μν΄ λκΈ°νλ μ₯μλ‘, λ½μ΄ λ°λ©λλ©΄ Entry Setμ μλ μ€λ λ μ€ νλμ μ€λ λκ° λ½μ νλνλ©° μκ³μμμΌλ‘ μ§μ νκ² λλ€.
νμ§λ§ μμ κ°μ λ°©μμ Entry Setμ μλ μ€λ λλ€μ μ°μ μμκ° λΆμ¬λμ§ μκΈ° λλ¬Έμ Entry Set λ΄μμ μ€λ«λμ λκΈ°νλ μ€λ λκ° μκΈ°λ 곡νμ± λ¬Έμ κ° λ°μν μ μλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ°©λ²μ΄ μλ° νμ€ APIμμ μ 곡νλ `java.util.concurrent.locks` ν¨ν€μ§μ Explicit Lockμ΄λ€.
βοΈ κ²°λ‘
JVM λ΄λΆμ μΌλ‘ κ²½μμνμ λ°λΌ λ½μ λ°©μμ λ¨κ³μ μΌλ‘ λ³κ²½νμ¬ μ±λ₯ ν₯μμ΄ κ°λ₯ν λ‘ νλ€.
νμ§λ§ synchronizedλ λ¨μΌ JVM νκ²½μμλ μ ν¨νμ§λ§ νλ μ ν리μΌμ΄μ μ λ€μ€ μλ²λ λ€μ€ JVMμμ ꡬλλλ κ²½μ°κ° λ§κΈ° λλ¬Έμ λΆμ° νκ²½μμ μ ν©νμ§ μμ μ μλ€. λ°λΌμ μ±λ₯μ μꡬμ¬νμ μΆ©μ‘±μν€κΈ° μν΄μλ λ½ μ€λ²ν€λλ₯Ό μ€μΌ μ μλ ReentrantLock, Atomic ν΄λμ€λ₯Ό, λΆμ° μμ€ν μ μ§μνκΈ° μν΄μλ Redis, Zookeeperμ κ°μ λΆμ°λ½ λμμ± μ μ΄ λꡬλ€μ μ¬μ©ν΄μΌνλ€.