我有一个带有两个线程使用的实例的类。从一个线程调用的方法是:
private Object sync1 = new Object();
private int state;
@Override
protected void onEnabled()
{
synchronized (sync1){
state = getState();
}
Log.i(TAG, "onEnabled() " + state );
}
和另一个:
@Override
public void onF1() {
int lState;
synchronized (sync1){
lState = state;
}
Log.i(TAG, "onF1 state " + lState);
}
启动应用程序时,它工作正常,但是在按下电源按钮关闭/打开屏幕后,我在logcat中得到以下输出:
16279-16788 I/MyClass: onEnabled() 1
16279-16372 I/MyClass: onF1 state 0
线程更重,可能它们运行在设备的不同核心上。我最初尝试使用volatile作为状态,然后去同步。任何线索为什么状态在onF1方法中不是1?
编辑1:我在类加载器上检查了哈希,它在之前/之后是相同的。对象地址也是一样的。我还尝试在变量上放置一个字段断点。
答案 0 :(得分:1)
第二个线程泄漏了对象的引用,因此在关闭/打开屏幕后,当重新创建Object时,线程具有不同的类实例。随后的测试中,线程的对象地址不同。