Item 79. Excessive Synchronization
κ³Όλν λκΈ°νλ νΌνλΌ
λκΈ°νλ μ€λ λ μμ μ±μ 보μ₯νκΈ° μν΄ μ¬μ©λλλ°, κ³Όλν λκΈ°νλ μ±λ₯μ μ νμν€κ±°λ, λ°λλ½μ λ°μμν€κ³ , λ ν° λ¬Έμ λ₯Ό λ°μμν¬ μ μλ€. μ΄λ¬ν λ¬Έμ λ₯Ό νΌνκΈ° μν΄μ , λκΈ°ν λ©μλλ λκΈ°ν λΈλ‘ μμ μ μ΄λ₯Ό ν΄λΌμ΄μΈνΈμκ² λκΈ°λ μλμ κ°μ μ¬μ©μ νΌν΄μΌ νλ€.
λκΈ°νλ μμ μμμ μ¬μ μν μ μλ λ©μλ νΈμΆ
ν΄λΌμ΄μΈνΈκ° λκ²¨μ€ ν¨μ κ°μ²΄ νΈμΆ
μΈλΆμμ μλ¬ λ°μ μ½λλ λκΈ°ν λ μμ λ΄μμ μμΈλ₯Ό λ°μμν€κ±°λ, λ°λλ½μ λΉ μ§κ±°λ λ°μ΄ν°λ₯Ό μμμν¬ μ μλ€.
μμΈκ° λ°μνλ μμ
μλλ μ§ν©(Set)μ κ°μΌ λνΌ ν΄λμ€λ‘, μ§ν©μ μμκ° μΆκ°λλ©΄ μλ¦Όμ λ°μ μ μλ κ΄μ°°μ ν¨ν΄μ ꡬνν μ½λμ΄λ€.
μ μ½λλ SetObserverλ₯Ό ꡬνν κ΄μ°°μλ₯Ό μΆκ°νκ³ , μμκ° μΆκ°λ λλ§λ€ κ΄μ°°μμκ² μλ¦Όμ 보λ΄λ ObservableSet ν΄λμ€μ΄λ€.
μ¬κΈ°μ νΉμ μμμμ κ΄μ°°μ μ€μ€λ‘λ₯Ό μ κ±°νλ μ½λλ₯Ό μΆκ°νλλ°, μ΄ μ½λμμ ConcurrentModificationException
μλ¬κ° λ°μνλ€.
set.add(i)
λ©μλ λ΄λΆμμnotifyElementAdded
λ₯Ό νΈμΆνκ³ , ν΄λΉ λ©μλ λ΄λΆμμadded
λ©μλλ₯Ό νΈμΆνκ² λ¨μ¦,
added
λ©μλλnotifyElementAdded
μμ 리μ€νΈλ₯Ό μννλ λμ€μ μνλ¨κ΅¬νν
added
λ©μλ λ΄λΆμμremoveObserver
λ₯Ό νΈμΆνμ¬ λ¦¬μ€νΈλ₯Ό μμ νλ € μλνμ§λ§
notifyElementAdded
λ©μλ λ΄λΆμμ 리μ€νΈ μν λμ€ λ¦¬μ€νΈλ₯Ό μμ νλ € μλνκΈ° λλ¬Έμ μλ¬ λ°μ
μ μ½λμμ notifyElementAdded
λκΈ°ν λΈλ‘ μμ λ΄λΆμμ μννλ μ½λκ° μμ΄ λμ μμ μ΄ μΌμ΄λμ§ μλλ‘ λ³΄μ₯νμ§λ§, μ½λ°±μ κ±°μ³ μμ νλ λΆλΆμ λκΈ°ν λΈλ‘ λ° μμμ΄κΈ° λλ¬Έμ λ§μ§ λͺ»νλ€.
λ°λλ½μ΄ λ°μνλ μμ
λ€μμ ν μ€νΈ μν λΆλΆμ μμ νμ¬, λ€λ₯Έ μ€λ λμμ κ΄μ°°μλ₯Ό μ κ±°νλλ‘ μμ ν΄λ³΄μ.
μ΄λ² μ½λμμ μμΈκ° λ°μνμ§ μμ§λ§ λ°λλ½μ΄ λ°μνμ¬ κ³μ λκΈ°νλ μνκ° λλ€.
λ€λ₯Έ μ€λ λμμ
set.removeObserver(this)
λ₯Ό νΈμΆνλ©΄μ μ κΈμ νλνλ € μλνμ§λ§ μ΄λ―Έ μν μ€μΈ λ©μΈ μ€λ λκ°
notifyElementAdded
λ©μλ λ΄λΆμμ μ κΈμ νλνκ³ μμ΄ λκΈ°λν λ©μΈ μ€λ λλ λ€λ₯Έ μ€λ λμμ
set.removeObserver(this)
λ₯Ό λκΈ°νκ³ μμ΄ λ°λλ½ λ°μ
ν΄κ²° λ°©λ²
μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μ , λκΈ°νλ μμ μμμ ν΄λΌμ΄μΈνΈκ° λκ²¨μ€ ν¨μ κ°μ²΄ νΈμΆ
μ νΌνλ©΄ λλ€.
μ΄λ κ² μ§μ λ‘μ§μ μΌλΆ μμ νμ¬ ν΄κ²°νλ λ°©λ²λ μ‘΄μ¬νμ§λ§, μλ°μμ μ 곡νλ λμμ± μ»¬λ μ μ μ¬μ©νλ λ°©λ²λ μλ€.
ArrayList
λμ CopyOnWriteArraySet
λ‘ μμ νκΈ°λ§ νλ©΄ κΈ°μ‘΄ μ½λμμλ λμ μμ μ΄ μΌμ΄λλ μμ νκ² λμνλ€.
λν 컬λ μ
λ΄λΆμμ λκΈ°νλ₯Ό μ²λ¦¬νκΈ° λλ¬Έμ λͺ
μμ μΌλ‘ μΆκ°ν λκΈ°ν λΈλ‘μ μ κ±°ν΄λ λλ€.
κ²°λ‘
λ¨μν μμΈ λ°μμ΄λ λ°λλ½μ νΌνλ κ²λ μ€μνμ§λ§, λ©ν° μ€λ λ μ²λ¦¬μ λͺ©μ μ μ±λ₯ ν₯μμ΄λ€. λ©ν° μ€λ λ μν μ€ κ°μ₯ λ§μ λΉμ©μ΄ λ°μνλ λΆλΆμ μ§μ° μκ°μΌλ‘, μ§μ° μκ°μ μ€μ΄λ κ²μ 곧 μ±λ₯ ν₯μμΌλ‘ μ΄μ΄μ§λ€. λκΈ°νλ₯Ό ν¨κ³Όμ μΌλ‘, κ·Έλ¦¬κ³ μμ μ μΌλ‘ μ¬μ©νκΈ° μν΄μ μλ κ·μΉμ λ°λ₯΄μ.
μ¬μ μν μ μκ±°λ μΈλΆμμ λμ΄μ¨ λ©μλ λκΈ°ν μμ λ΄μμ μν κΈμ§
λκΈ°ν μμ λ΄μμ μννλ μΌμ μ κ²νμ¬ λ½μ κ°μ§κ³ μλ μκ°μ μ΅μν
Last updated
Was this helpful?