多线程环境下为了避免死锁,一般提倡开放调用,开放调用可以避免死锁,它的代价是失去原子性。但是在有些时候会显得逻辑错误,例如:
例如
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之前的。