Android 多線程實現(xiàn)重復(fù)啟動與停止的服務(wù)
Android 多線程實現(xiàn)重復(fù)啟動與停止的服務(wù)
多線程環(huán)境下為了避免死鎖,一般提倡開放調(diào)用,開放調(diào)用可以避免死鎖,它的代價是失去原子性。但是在有些時候會顯得邏輯錯誤,
例如:
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();
}
}
}
在單線程環(huán)境下這個代碼沒有任何問題??墒窃诙嗑€程環(huán)境就會出現(xiàn)奇怪的現(xiàn)象。
原則上講, onStart 一定要走在onStop前面,可事實并非如此:
執(zhí)行步驟如下:
線程1 start
線程2 stop
線程1
if(!mIsStarted){
mIsStarted = true;
changed = false;
}
線程2
synchronized(this){
if(mStarted){
mStarted = false;
changed = true;
}
}
線程2 onStop
線程1 onStart
現(xiàn)在onStop 走在了onStart前面。那么問題來了,如何才能保證onStart 一定在onStop前面呢?
那么問題又來了,stop 方法為什么不允許在start之前調(diào)用呢?如果一個類不可restart,那么stop是可以在start之前的,否則是不可以在start之前的。
以上就是Android 多線程實現(xiàn)重復(fù)啟動與停止的服務(wù)的講解,如有疑問請留言或者到本站社區(qū)交流討論,感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android UI自定義ListView實現(xiàn)下拉刷新和加載更多效果
這篇文章主要介紹了Android UI自定義ListView實現(xiàn)下拉刷新和加載更多效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
輕松實現(xiàn)Android仿淘寶地區(qū)選擇功能
這篇文章主要介紹了輕松實現(xiàn)Android仿淘寶地區(qū)選擇功能的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-06-06

