μλ΅ λΆκ°μ μμ μ€ν¨λ₯Ό νΌνλ €λ©΄ λκΈ°ν λ©μλλ λκΈ°ν λ€λ μμμλ μ μ΄λ₯Ό μ λλ‘ ν΄λΌμ΄μΈνΈμ μλνλ©΄ μλλ€ !
- μ μ΄λ₯Ό ν΄λΌμ΄μΈνΈμκ² μλ ?
- μ¬μ μ κ°λ₯ν λ©μλλ₯Ό νΈμΆνλ νμ
- ν΄λΌμ΄μΈνΈκ° λκ²¨μ€ ν¨μκ°μ²΄λ₯Ό νΈμΆνλ νμ
μ΄λ κ² μΈλΆμμ μ¨ λ©μλλ€μ μΈκ³μΈ λ©μλ
λΌκ³ νλ©°, μ΄ μΈκ³μΈ λ©μλλ€μ λ¬΄μ¨ μ§μ ν μ§ μμΈ‘ν μ μκ³ , μμΈλ κ΅μ°©μν, λ°μ΄ν°λ₯Ό νΌμν μ μλ€.
- (κ°μ ν¨ν€μ§μ ObservableSet μ 보μ.) μ΄ ν΄λμ€λ μ΅μ λ² ν΄λμ€μ΄κ³ , ν¨μν μΈν°νμ΄μ€ 리μ€νΈλ₯Ό 곡μ μμμΌλ‘ μ¬μ©νλ©°, ꡬλ /ν΄μ§/μλμμ λκΈ°νλ₯Ό μ§ννκ³ μλ€.
- (κ°μ ν¨ν€μ§μ ObserverUser μ 보μ.) μ¬κΈ°μλ ν¨μν μΈν°νμ΄μ€λ₯Ό λ£κ³ , μ¬μ©νλλ° 1~99 κΉμ§ μΆλ ₯νλ 루νλ¬Έμμ 23μμ μ΅μ λ²μ ꡬλ μ ν΄μ νκ³ μλ€.
μ΄ μ¬μ©μ κ²°κ³Όλ 23μμ ConcurrentModificationException μ΄λ€.
λ€μμ 23 μμ add λ₯Ό νλ©΄ μ€νλλ λ©μλλ₯Ό μμλλ‘ μ μ κ²μ΄λ€.
@Override
public boolean add(E e) {
boolean added = super.add(e);
if (added) notifyElementAdded(e);
return added;
}
private void notifyElementAdded(E element) {
synchronized (observers) {
for (SetObserver<E> observer : observers) {
observer.added(this, element);
}
}
}
public boolean removeObserver(SetObserver<E> observer) {
synchronized (observers) {
return observers.remove(observer);
}
}
- λλ²μ§Έ λ©μλμμ 보면 added λ©μλκ° observers λ₯Ό μννλ€κ°, removeObserver λ₯Ό μ€ννκ³ , removeObserver λ observers μ μμλ₯Ό μμ νλ€.
- λκΈ°ν λΈλμμ μΈλΆμ λ©μλλ₯Ό μ¬μ©νκ²μ΄λ€.
- μ΄ λΆλΆμμ synchronized μ λκΈ°ν λΈλμ μμ νλ € νκΈ°μ μλ¬κ° λ°μνλ€.
- (κ°μ ν¨ν€μ§μ ObserverUserExecutor μ 보μ.) ExecutorService λ₯Ό μ΄μ©νμ¬ μ€λ λνμ μ€λ λμκ² μμ μ 맑겼λ€.
- μ΄ κ²½μ°μλ μμΈλ λμ§ μμ§λ§, κ΅μ°©μνμ λΉ μ§λ€.
- λ°±κ·ΈλΌμ΄λ μ€λ λκ° s.removeObserver λ₯Ό νΈμΆνλ©΄, κ΄μ°°μλ₯Ό μ κ·Έλ € μλνλ€.
- νμ§λ§ μ΄λ―Έ λ©μΈ μ€λ λκ° λ½μ μ₯κ³ μκΈ° λλ¬Έμ λ½μ μ»μ μ μλ€.
- λμμ λ©μΈ μ€λ λ λ°±κ·ΈλΌμ΄λ μ€λ λκ° κ΄μ°°μλ₯Ό μ κ±°νκΈ°λ₯Ό κΈ°λ€λ¦¬κ³ μμΌλ―λ‘ κ΅μ°©μνμ λΉ μ§λ€.
-
μμ λ μλ μ€ν¨νκΈ΄ νμ§λ§, κ°μ²΄μ μνκ° μ μ§λ μνμ΄λ€.
-
λ§μ½ λΆλ³μμ΄ κΊ μ§ μνλΌλ©΄?
-
μλ° μΈμ΄λ μ¬μ§μ μ νμ©νλ€.
- μ¬μ§μ : λ½μ νλμ΄ νΈμΆ λ¨μκ° μλ μ€λ λ λ¨μλ‘ μΌμ΄λκΈ° λλ¬Έμ, μ΄λ―Έ λ½μ νλν μ€λ λλ κ°μ λ½μ μ»κΈ° μν΄ λκΈ°ν νμ μλ€.
- μλ°μ synchronized λΈλ‘μ μ¬μ§μ μ΄ νμ©λλ€. ν μ°λ λκ° synchronized λΈλ‘μ μ§μ νλ©° λͺ¨λν° κ°μ²΄μ λ½μ νλνλ©΄, μ°λ λλ μμ μ΄ νλν λͺ¨λν° κ°μ²΄μ λν λ€λ₯Έ synchronized λΈλ‘μΌλ‘λ μ§μ ν μ μλ€.
-
λ½μ΄ μ¬ κ΅¬μ€μ νμ§ λͺ»νκΈ°μ, κ΅μ°©μνμ λ°μ΄ν°λ₯Ό μμ μ€ν¨ (λ°μ΄ν° νΌμ) μΌλ‘ μ΄μ΄μ§ μ μλ€.
- notify λ©μλμ λκΈ°νκ° λ¬Έμ λ€.
- 첫λ²μ§Έ μμμμλ, notify λ©μλμ λκΈ°νλ 리μ€νΈλ₯Ό μν λμ€ μμ μ νλ € ν΄μ μΌμ΄λ λ¬Έμ .
- λλ²μ¨° μμμμλ, notify λ©μλμ λκΈ°ν λΈλμ΄ λ©μΈ λ©μλμ λ½ λλ¬Έμ λ½μ μ»μ μ μμ. (κ°μ κ°μ²΄μ λ½μ μ»μΌλ €ν¨)
- λ°λΌμ notify μ μν(μΈκ³μΈ λ©μλμ νΈμΆ)λ₯Ό λ°μΌλ‘ λΉΌλ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
- λκΈ°ν μμ λ°μμ νΈμΆλλ μΈκ³μΈ λ©μλλ₯Ό
μ΄λ¦° νΈμΆ
μ΄λΌ νλ€.
- λκΈ°ν μμ λ°μμ νΈμΆλλ μΈκ³μΈ λ©μλλ₯Ό
- λλ μ΄ μν©μ λ§κ² μ€κ³λ
CopyOnWriteArrayList
λ₯Ό μ¬μ©νλ©΄, λκΈ°ν μμ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
- λκΈ°ν μμμμλ κ°λ₯ν μ μ μΌμ ν΄μΌνλ€.
1 λ½μ μ»κ³
,2 곡μ λ°μ΄ν°λ₯Ό κ²μ¬νκ³
,3 νμνλ©΄ μμ νκ³
,4 λ½μ λλλ€
.
- λκΈ°νλ₯Ό μ ν νμ§ λ§κ³ , κ·Έ ν΄λμ€λ₯Ό μ¬μ©νλ ν΄λμ€κ° μΈλΆμμ λκΈ°ν νλλ‘ λ λκΈ°κΈ°
- java.util (Vector, HashTable μ μΈ)
- λκΈ°νλ₯Ό λ΄λΆμμ μνν΄ μ€λ λ μμ ν΄λμ€λ‘ λ§λ€κΈ°
- μΈλΆμμ κ°μ²΄ μ 체μ λ½μ κ±°λ κ² λ³΄λ€ λμμ±μ μλ±ν κ°μ ν μ μμλλ§ μ¬μ©.
- java.util.concurrent
- StringBuffer λ μ΄ λ°©μμΌλ‘ μ€κ³λμλ€. νμ§λ§ StringBuffer λ λ³΄ν΅ λ¨μΌ μ€λ λμμ μ¬μ©νκΈ°μ, μ΄ λ°©λ²μ΄ μ±λ₯μ λ¨μ΄λ¨λ Έλ€.
- κ·Έ κ²°κ³Ό λ΄λΆ λκΈ°νλ₯Ό νμ§ μλ StringBuilder κ° λμλ€.