
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 多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android 多线程实现重复启动与停止的服务全部内容,希望文章能够帮你解决Android 多线程实现重复启动与停止的服务所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)