????????????????Щ?????????(zhuang)?(bi)???????????????????????????????????????????????????????????????С????????????á????????????????????????????Щ????????????д????
????????????????????????????????……
???????????
??????????????д StateHolder ?????????????????????ConcurrentModificationException??????????????????????????????????????????????????????????????????????
????java.util.ConcurrentModificationException
????at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
????at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
????at com.codeaffine.events.StateProvider.broadcast(StateProvider.java:60)
????at com.codeaffine.events.StateProvider.setState(StateProvider.java:55)
????at com.codeaffine.events.StateProvider.main(StateProvider.java:122)
?????????????????????????????????????????????? HashMap ?? Iterator ???????????????????????????κε???????????????e?????????????????????д?? broadcast ??????? for each ???????????????????????????????????
???????????????????У?????????????????? StateHolder ?????????????????п?????? ConcurrentModificationException????????????????????????в?????????????????????????????????????????snapshot??????е????????
?????????????“?????????”???????????????????????????????????????????????????????仯??????? broadcast ????????е??????????????????????????????????????
????private void broadcast( StateEvent stateEvent ) {
????Set<StateListener> snapshot = new HashSet<>( listeners );
????for( StateListener listener : snapshot ) {
????listener.stateChanged( stateEvent );
????}
????}
???????????? StateHolder ???????????????????????
???????
???????????????????? StateHolder ??????????????????????????????????????????????????????????? synchronized ???????????
????public class StateHolder {
????public synchronized void addStateListener( StateListener listener ) {  [...]
????public synchronized void removeStateListener( StateListener listener ) {  [...]
????public synchronized int getState() {  [...]
????public synchronized void setState( int state ) {  [...]
?????????????д???? ??? StateHolder ????????????????????Intrinsic Lock?? ???????????ù??з???????????????????????????????????????????????????
???????……?????????????????????????????????????????????е???????????
??????????????????????Σ???? A ????? StateHolder ???? S?????????????????listener????????? S ???????? B ????????? S ?????????????? B ????????????????????????????????????? S????????????????????????????е???????????????????????????????????
??????????????????С??????????????????“???????”????????????????
public class StateHolder {
private final Set<StateListener> listeners = new HashSet<>();
private int state;
public void addStateListener( StateListener listener ) {
synchronized( listeners ) {
listeners.add( listener );
}
}
public void removeStateListener( StateListener listener ) {
synchronized( listeners ) {
listeners.remove( listener );
}
}
public int getState() {
synchronized( listeners ) {
return state;
}
}
public void setState( int state ) {
int oldState = this.state;
synchronized( listeners ) {
this.state = state;
}
if( oldState != state ) {
broadcast( new StateEvent( oldState?? state ) );
}
}
private void broadcast( StateEvent stateEvent ) {
Set<StateListener> snapshot;
synchronized( listeners ) {
snapshot = new HashSet<>( listeners );
}
for( StateListener listener : snapshot ) {
listener.stateChanged( stateEvent );
}
}
}
??????????δ?????????????????????????????????? Set ?????????????????????????Щ?????????????????????????????????????????????????????????????
???????: ????????????????????????????????????????仯?????????????????????ε??????????????????????????????????н????????????? StateHolder ??????????????????
?????????????????????????????????????????????????????????????????????????FIFO????????????????????????? setState ??????????????????????? FIFO ????????????????????????????????????????????????????????????-????????????????????????????e????????Σ??????????а???????????С??????????????????????????????????????????
???????????????????????????????? CopyOnWriteArraySet ?? AtomicInteger ??д???????????????????????????????????????????
public class StateHolder {
private final Set<StateListener> listeners = new CopyOnWriteArraySet<>();
private final AtomicInteger state = new AtomicInteger();
public void addStateListener( StateListener listener ) {
listeners.add( listener );
}
public void removeStateListener( StateListener listener ) {
listeners.remove( listener );
}
public int getState() {
return state.get();
}
public void setState( int state ) {
int oldState = this.state.getAndSet( state );
if( oldState != state ) {
broadcast( new StateEvent( oldState?? state ) );
}
}
private void broadcast( StateEvent stateEvent ) {
for( StateListener listener : listeners ) {
listener.stateChanged( stateEvent );
}
}
}
??????? CopyOnWriteArraySet ?? AtomicInteger ????????????????????????????????????????“??????”?????????£?????????????????????????????????????????????????ε??????????????Set?????????????
???????????Щ????????????? CopyOnWriteArraySet ???? Iterator????????????????????????“????“??CopyOnWriteXXX ????????????????????????????′????????——????С?????????????Ч????????????????????????????????????????????????ζ?????????????????
???????? Java 8 ???????broadcast ???????????Iterable#forEach ?? lambdas?????????????????????????????????????????????????????“????”?н??У?
????private void broadcast( StateEvent stateEvent ) {
????listeners.forEach( listener -> listener.stateChanged( stateEvent ) );
????}
??????????
?????????????????δ?????? RuntimeExceptions ????Щ?????????????????????????? fail-fast ?????????????????????????????ò???????????????????俼????????????????Щ???????????????
??????????????????????????????????????????????????????????????????????????Щ?????????????????????????????????????????????ī????????????????е??????????????
????????????????????????? try-catch ??????????????????????á?
????private void broadcast( StateEvent stateEvent ) {
????listeners.forEach( listener -> notifySafely( stateEvent?? listener ) );
????}
????private void notifySafely( StateEvent stateEvent?? StateListener listener ) {
????try {
????listener.stateChanged( stateEvent );
????} catch( RuntimeException unexpected ) {
????// appropriate exception handling goes here...
????}
????}
???????
??????????????Java ??????????????Щ??????????????ü?????????????????У?????????????????????????????????????????????????????????????????????????????
?????????д????Щ??????????????????????????????????????????????????????????????е??????????????????????????????????????????????????ɡ?