Android 多線程實現重復啟動與停止的服務
多線程環境下為了避免死鎖,一般提倡開放調用,開放調用可以避免死鎖,它的代價是失去原子性。但是在有些時候會顯得邏輯錯誤,
例如:
class A{ private boolean mIsStarted; void start(){ boolean changed = false; synchronized(this){ if(!mIsStarted){ mIsStarted = true; changed = false; } if(changed){ callBack.onStart(); } } } boolean isStarted(){ sychronized(this){ return mIstarted; } } void stop(){ boolean changed = false; synchronized(this){ if(mStarted){ mStarted = false; changed = true; } } if(changed){ callBack.onStop(); } } } 在單線程環境下這個代碼沒有任何問題。可是在多線程環境就會出現奇怪的現象。
原則上講, onStart 一定要走在onStop前面,可事實并非如此:
執行步驟如下:
線程1 start
線程2 stop
線程1
if(!mIsStarted){ mIsStarted = true; changed = false; } 線程2
synchronized(this){ if(mStarted){ mStarted = false; changed = true; } } 線程2 onStop
線程1 onStart
現在onStop 走在了onStart前面。那么問題來了,如何才能保證onStart 一定在onStop前面呢?
那么問題又來了,stop 方法為什么不允許在start之前調用呢?如果一個類不可restart,那么stop是可以在start之前的,否則是不可以在start之前的。
以上就是Android 多線程實現重復啟動與停止的服務的講解,如有疑問請留言或者到本站社區交流討論,感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!
新聞熱點
疑難解答