ThreadLocal

Java ThreadLocalμ Java 1.2λΆν° λμ λμλ€. Key, Valueλ‘ κ΅¬μ±λμ΄ μμ
Key : Current Thread
Value : Any Object
ThreadLocalμ κ° μ€λ λλ§λ€ λ 립μ μΈ κ°μ μ μ₯ν μ μκ² ν΄μ£Όλ ν΄λμ€μ΄λ€. λ€μ λ§ν΄, λμΌν ThreadLocal κ°μ²΄λ₯Ό μ¬λ¬ μ€λ λκ° κ³΅μ νλλΌλ κ° μ€λ λλ μμ λ§μ κ³ μ ν κ°μ κ°μ§ μ μλ€.
μ€λ λ λ‘컬μ μ€νλ§κ³Ό κ°μ νλ μμν¬μμ λ§μ΄ μ¬μ©λλ€. λ©μλμ λ§€κ°λ³μλ‘ μ λ¬νμ§ μκ³ λ κ°μ accessκ° κ°λ₯νλ€. μλμ κ°μ΄ μ¬λ¬ Serviceλ₯Ό κ±°μΉλ μμ²μ΄ μλ€.

κ°μ₯ λ¨Όμ μμ²μ΄ λ€μ΄μ€λ©΄
μ¬μ©μ μΈμ¦μ μλνλ€.ν ν°μ΄ μμ±λ μ μκ³ , νμ¬ μ€λ λλ μ€λ λ λ‘컬μ ν ν°κ³Ό μ¬μ©μ κΆνμ μ μ₯ν μ μλ€.
λ§μ§λ§ μλΉμ€ κ³μΈ΅κΉμ§ μλ€. λ©μλκ° μ€νλκΈ° μ μ κΆνμ νμΈνλ€.
λͺ¨λ μλΉμ€μ μ¬μ©μ κΆνμ λ§€κ°λ³μλ₯Ό ν΅ν΄ μ λ¬ν νμλ μλ€.
μ€λ λλ μ€λ λ λ‘컬μ accessνμ¬ κΆνμ λ¬Όμ΄λ³Ό μ μλ€.
μ΄κ²μ΄ κ°μ₯ μΌλ°μ μΈ μ¬λ‘ μ€ νλμ΄λ€.
λ©ν°μ½μ΄ νλ‘μΈμ μμ€ν μμ Synchronizedλ₯Ό μ¬μ©νλ©΄ μ€λ λκ° Lockμ μ»κΈ° μν΄ λκΈ°ν΄μΌ νλ€.
μ΄λ μ±λ₯μ μν₯μ μ€ μ μλ€.
λ°λΌμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ βμ€λ λ λ‘컬βμ μ¬μ©ν μ μλ€.
κ°κ°μ μ€λ λλ κ°μ²΄λ₯Ό μμ±νμ¬ μ€λ λ λ‘컬μ λ£μ μ μλ€.
λκΈ°ν λ° μ€λ λ μμ μ±μ λν΄ κ±±μ ν νμκ° μλ€.
νμ§λ§ μ€λ λ λ‘컬μλ λͺ κ°μ§ κ²°ν¨μ΄ μ‘΄μ¬νλ€.
λ³κ²½μ΄ κ°λ₯νλ€.
GCμ μν΄ μκ±°λμ§ μκΈ° λλ¬Έμ κ³μ λ©λͺ¨λ¦¬μ λ¨μ μ μλ€.
μλμΌλ‘ μ κ±°ν΄μΌ ν¨.
μ΄λ₯Ό μ κ±°νλ €λ©΄ μ€λ λ μμ²΄κ° μ£½κ±°λ APIλ₯Ό μ€κ³ν΄μΌ νλ€.
μ΄κ²μ λ©λͺ¨λ¦¬ λμλ‘ μ΄μ΄μ§ μ μλ€.
μ€λ λ λ‘컬μ μ μ νμΌκ³Ό ν¨κ» μ¬μ©λμ΄μΌ νλ€. (static final)
removeλ₯Ό νλκ²μ μμΌλ©΄ μλλ€.
μμ²μ΄ μ²λ¦¬λλ©΄ κΌ μ κ±° ν΄μΌνλ€. β μ΄κ²μ΄ μ€λ λ λ‘컬μ νλμ λ¬Έμ
μ€λ λ λ‘컬μ μ£Όμ νΉμ§μλ μ€λ λκ° μ’ λ£λλ©΄ ν΄λΉ μ€λ λ λ‘컬μ κ°λ μλμΌλ‘ μ 리λλλ°, κ·Έλ λ€λ©΄ remove ν νμκ° μλκ²μ΄ μλκ°?
μ€λ λ κ°μ²΄κ° λ μ΄μ μ°Έμ‘°λμ§ μμΌλ©΄ ThreadLocal κ°λ GCμ λμμ΄ λλ€κ³ νλ€.
μ¬κΈ°μ μ£Όμν΄μ¬ ν μ μ μ€λ λ νμ μ¬μ©νλ κ²½μ°μΈλ°, μ€λ λ νμμλ μ€λ λκ° μμ ν μ’ λ£λμ§ μκ³ μ¬μ¬μ©λκΈ° λλ¬Έμ ThreadLocal κ°μ΄ κ·Έλλ‘ λ¨μμμ μ μκΈ° λλ¬Έμ μ΄λ¬ν νκ²½μ΄λΌλ©΄ remove()μ μ¬μ©μ΄ κΆμ₯λλ€.
ν€ μ‘°ν λ©μ»€λμ¦
μ€μ λ‘ κ°μ ThreadLocalμ κ°μ²΄λ₯Ό μ¬μ©νμ§λ§, κ° μ€λ λμ κ³ μ ν λ§΅μ μ μ₯λλ€.
λ°λΌμ get()μ νΈμΆνλ©΄ νμ¬ μ€ν μ€μΈ μ€λ λμ λ§΅μμ κ°μ μ°Ύλλ€.
μ€λ λ λ‘컬 μμ
μ€λ λ λ‘컬μ μμλ μ μλ€.
call μ΄ μμλ λ μλ‘μ΄ μ€λ λλ₯Ό μμ±ν΄μ λ©μλλ₯Ό νΈμΆνλλ°, token κ°μ νμΈν΄λ³΄λ©΄ nullμ΄ λ€μ΄κ°μλ€.
νμ μ€λ λκ° μμ μ€λ λ κ°μ access ν μ μλ€.
λ§μ½ μ κ·Όνκ³ μΆλ€λ©΄ IngeritableThreadLocal<>()λ‘ μμ±νλ€.
νμ μ€λ λκ° λ€λ₯Έ κ°μ μ€μ νλ©΄? μμ μ€λ λκ° μν₯μ λ°μκΉ?
μμ μ€λ λλ μν₯μ λ°μ§ μλλ€. μλ‘ λ³΅μ¬νκΈ° λλ¬Έμ΄λ€.
νμ μ€λ λμμ 무μΈκ°λ₯Ό μμ νκ±°λ μ κ±°νλ©΄ λ°λκΈ΄ νμ§λ§ νμ μ€λ λμμλ§ μν₯μ μ€λ€.
νλμ κ°μ μ€λ λλ λ λ€λ₯Έ κ°μ μ€λ λλ₯Ό 무μν μμ±ν μ μλ€.
μ΄ κ³Όμ μμ ThreadLocalμ λͺ¨λ 볡μ , μ°Έμ‘° 볡μ , νμ μ€λ λμμ 곡μ λ₯Ό κ³μ μννλ€λ©΄ λ¬Έμ κ° λ°μνλ€.
Scoped Value
comiler-plugin:21:βenable-previewλ₯Ό νμ±ν ν΄μΌνλ€.
νλ‘λμ νκ²½μμ μ¬μ©νλ©΄ μλ¨
μ€λ λ λ‘컬μμλ κ°μ΄ μλλ° get()μ νλ©΄ nullμ λ°ννλ€.
νμ§λ§ μ¬κΈ°μλ NoSuchElementExceptionμ΄ λ°μνλ€. λ°λΌμ κ°μ΄ λ¨Όμ μλμ§ νμΈν΄μΌ νλ€.
κ°μ΄ μλλΌλ
orElseThrowλ₯Ό μ¬μ©νμ§ λ§λΌ.
Last updated