Android 多线程实现重复启动与停止的服务
Android多线程实现重复启动与停止的服务
多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性。但是在有些时候会显得逻辑错误,
例如:
classA{ privatebooleanmIsStarted; voidstart(){ booleanchanged=false; synchronized(this){ if(!mIsStarted){ mIsStarted=true; changed=false; } if(changed){ callBack.onStart(); } } } booleanisStarted(){ sychronized(this){ returnmIstarted; } } voidstop(){ booleanchanged=false; synchronized(this){ if(mStarted){ mStarted=false; changed=true; } } if(changed){ callBack.onStop(); } } }
在单线程环境下这个代码没有任何问题。可是在多线程环境就会出现奇怪的现象。
原则上讲,onStart一定要走在onStop前面,可事实并非如此:
执行步骤如下:
线程1start
线程2stop
线程1
if(!mIsStarted){ mIsStarted=true; changed=false; }
线程2
synchronized(this){ if(mStarted){ mStarted=false; changed=true; } }
线程2onStop
线程1onStart
现在onStop走在了onStart前面。那么问题来了,如何才能保证onStart一定在onStop前面呢?
那么问题又来了,stop方法为什么不允许在start之前调用呢?如果一个类不可restart,那么stop是可以在start之前的,否则是不可以在start之前的。
以上就是Android多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!