Android 多线程实现重复启动与停止的服务
程序员文章站
2023-12-12 17:31:46
android 多线程实现重复启动与停止的服务
多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性。但是在有些时候会显得逻辑错误,...
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 多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!