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 多线程实现重复启动与停止的服务的讲解,如有疑问请留言或者到本站社区交流讨论,感谢 阅读,希望能帮助到大家,谢谢大家对本站的支持!

02-07 12:07
查看更多