item 82 jihoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
μλ°λ μ΄ κΈ°λ³Έ μ΅μ μμ μμ±ν API λ¬Έμμλ synchronized νμ μκ° ν¬ν¨λμ§ μλλ€. λ©μλ μ μΈμ synchronized νμ μλ₯Ό μ μΈν μ§λ ꡬν μ΄μμΌ λΏ APIμ μνμ§ μλλ€. λ°λΌμ μ΄κ²λ§μΌλ‘λ κ·Έ λ©μλκ° μ€λ λ μμ νλ€κ³ λ―ΏκΈ° μ΄λ ΅λ€.
- λΆλ³(immutable)
- μ΄ ν΄λμ€μ μΈμ€ν΄μ€λ λ§μΉ μμμ κ°μ μΈλΆ λκΈ°νλ νμ μλ€
- E.g. String, Long, BigInteger
- 무쑰건μ μΈ μ€λ λ μμ (unconditionally thread-safe)
- μ΄ ν΄λμ€μ μΈμ€ν΄μ€λ μμ λ μ μμ§λ§ λ΄λΆμμλ μΆ©μ€ν λκΈ°ννμ¬ λ³λμ μΈλΆ λκΈ°νμμ΄ λμμ μ¬μ©ν΄λ μμ
- E.g. AtomicLong, ConcurrentHashMap
- μ‘°κ±΄λΆ μ€λ λ μμ (conditionally thread-safe)
- 무쑰건μ μΈ μ€λ λ μμ μ±κ³Ό κ°μ§λ§ μΌλΆ λ©μλλ λμμ μ¬μ©νλ €λ©΄ μΈλΆ λκΈ°νκ° νμν©λλ€.
- E.g. Collections.synchronized Wrapper λ©μλκ° λ¦¬ν΄ν 컬λ μ (μ΄ μ»¬λ μ λ€μ΄ 리ν΄ν λ°λ³΅μλ μΈλΆμμ λκΈ°νν΄μΌ νλ€)
- μ€λ λ μμ νμ§ μμ(not thread-safe)
- μ΄ ν΄λμ€μ μΈμ€ν΄μ€λ μμ λ μ μκ³ , λμμ μ¬μ©νλ €λ©΄ κ°κ°μ λ©μλ νΈμΆμ ν΄λΌμ΄μΈνΈκ° μ νν μΈλΆ λκΈ°ν λ‘μ§μΌλ‘ κ°μΈμΌ νλ€.
- E.g. ArrayList, HashMap
- μ€λ λ μ λμ (thread-hostile)
- μΈλΆ λκΈ°νλ‘ κ°μΈλλΌλ λ©ν°μ€λ λ νκ²½μμ μμ νμ§ μλ€.
- μ΄λ¬ν ν΄λμ€λ λμμ±μ κ³ λ €νμ§ μκ³ λ§λ€λ€λ³΄λ©΄ μ°μ°ν λ§λ€μ΄μ§λ€.
-
μ‘°κ±΄λΆ μ€λ λ μμ ν ν΄λμ€λ μ£Όμνμ¬ λ¬Έμνν΄μΌ νλ€.
- μ΄λ ν μμλ‘ νΈμΆν λ μΈλΆ λκΈ°ν λ‘μ§μ΄ νμνμ§, κ·Έλ¦¬κ³ κ·Έ μμλ‘ νΈμΆνλ €λ©΄ μ΄λ€ λ½μ μ»μ΄μΌλ§ νλμ§ μλ €μ£Όμ΄μΌ νλ€.
- μΌλ°μ μΌλ‘ μΈμ€ν΄μ€ μ체λ₯Ό λ½μΌλ‘ μ»μ§λ§, μμΈλ μλ€.
// synchronizedMapμ΄ λ°νν 맡μ μ½λ μ λ·°λ₯Ό μννλ €λ©΄, λ·°(μΈμ€ν΄μ€ μ체)κ° μλ λ°λμ κ·Έ 맡μ λ½μΌλ‘ μ¬μ©ν΄ μλμΌλ‘ λκΈ°ννλΌ Map<K, V> m = Collections.synchronizedMap(new HashMap()); Set<K> s = m.keySet(); // λκΈ°ν λΈλ‘ λ°μ μμ΄λ λλ€. ... synchronized (m) { // sκ° μλ mμ μ¬μ©ν΄ λκΈ°νν΄μΌ νλ€. for (K key : s) key.f(); } // μ΄λλ‘ λ°λ₯΄μ§ μμΌλ©΄ λμμ μμΈ‘ν μ μλ€
-
ν΄λμ€μ μ€λ λ μμ μ±μ λ³΄ν΅ ν΄λμ€μ λ¬Έμν μ£Όμμ κΈ°μ¬
-
λ νΉν νΉμ±μ λ©μλλΌλ©΄ ν΄λΉ λ©μλμ μ£Όμμ κΈ°μ¬
-
μ΄κ±°νμ μ κ΅³μ΄ λΆλ³μ΄λΌκ³ μΈ νμ μμ
-
λ¦¬ν΄ νμ λ§μΌλ‘λ λͺ νν μ μ μλ μ μ ν©ν°λ¦¬λ μμ μ΄ λ¦¬ν΄νλ κ°μ²΄μ μ€λ λ μμ μ±μ λ°λμ λ¬Έμνν΄μΌ νλ€(Collections.synchronizedMapμ΄ μ’μ μ)
- ν΄λμ€κ° μΈλΆμμ μ¬μ©ν μ μλ lockμ μ 곡νλ©΄ ν΄λΌμ΄μΈνΈμμ μΌλ ¨μ λ©μλ νΈμΆμ μμμ μΌλ‘ ν μ μλ€.
- λ΄λΆμμ μ²λ¦¬νλ κ³ μ±λ₯ λμμ± μ μ΄ λ©μ»€λμ¦κ³Ό νΌμ©ν μ μκ² λλ€.
- ν΄λΌμ΄μΈνΈκ° 곡κ°λ lock μ€λ μ₯κ³ λμ§ μλ μλΉμ€ κ±°λΆ κ³΅κ²©(denial-of-service attack)μ μνν μ μλ€.
- μ΄ κ³΅κ²©μ λ§κΈ° μν΄μλ 곡κ°λ lockμ΄λ λ§μ°¬κ°μ§μΈ synchronized λ©μλ λμ λΉκ³΅κ° lock κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ νλ€.
private final Object lock = new Object();
public void someMethod() {
synchronized(lock) {
...
}
}
- lock νλλ₯Ό νμ finalλ‘ μ μΈνλΌ
- lock κ°μ²΄κ° μ°μ°νλΌλ κ΅μ²΄λλ μΌ μλ°©
- μΌλ°μ μΈ κ°μ lock, java.util.concurrent.locks ν¨ν€μ§μμ κ°μ Έμ¨ lock λͺ¨λ ν΄λΉ
- λΉκ³΅κ° lock κ°μ²΄ κ΄μ©κ΅¬λ 무쑰건μ μ€λ λ μμ ν΄λμ€μμ μ¬μ©ν μ μλ€
- μ‘°κ±΄λΆ μ€λ λ μμ ν΄λμ€μμλ νΉμ νΈμΆ μμμ νμν λ½μ΄ 무μμΈμ§λ₯Ό ν΄λΌμ΄μΈνΈμκ² μλ €μ€μΌ νλ―λ‘ μ΄ κ΄μ©κ΅¬λ₯Ό μ¬μ©ν μ μλ€.