スレッドセーフな Observable
スレッドセーフな Observable.[ロック方針] 一般に,Observer を継承する ConcreteObserver と,Observable を継承する ConcreteObservable 間では,ConcreteObsever -> ConcreteObservable という 方向の呼び出しが自然に起こる.しかし,update() の呼び出しは, ConcreteObservable から ConcreteObserver へのコールバックとなる.
* * ConcreteObservable ConcreteObserver * | | * setState()| | * ---------> | | * |--+ | * | |setChanged() | * |<-+ | * notify | | * Observers()| | * ---------> | | * |★ここで一旦 | * |全ロック解放 | * | safeUpdate() | * |-------------------------------->|★ここでロックを * | |取得する. * | |--+ * | | | update() * | getState() |<-+ * |<--------------------------------| * *notifyObservers() では,update() の前に現在取得している一切の ロックを解放することにする.これによって,デッドロックの可能性 を回避する.アプリケーションは,ConcreteObserver -> ConcreteObservable の 呼び出しを正順として,ロックの取得もこの順序とすることが望まれる.
Observer の update 呼び出しの前に,ロックを解放
することに注意.
Observer の update 呼び出しの前に,ロックを解放
することに注意.
Observer の update 呼び出しの前に,ロックを解放を
行わないため,デッドロックの可能性を含むことに注意.
Observer の update 呼び出しの前に,ロックを解放を
行わないため,デッドロックの可能性を含むことに注意.
このクラスでは,true となる.
Observer のデストラクタは呼び出さないことに注意.
virtual void addObserver(TJObserver* o)
virtual void removeObserver(TJObserver* o)
virtual void removeObservers()
virtual void notifyObservers()
virtual void notifyObservers(void* arg)
virtual void notifyObserversRetainingLock()
virtual void notifyObserversRetainingLock(void* arg)
virtual bool hasChanged() const
virtual unsigned countObservers() const
virtual void destroyObservers() const
virtual bool isSafe() const
virtual bool hasObserver(const TJObserver* o) const
virtual ~TJSafeObservable()
索引(アルファベット順) HTMLクラス継承 または Java