屏幕关闭/打开后,同步(和易失性)无法正常工作

时间:2018-02-13 10:27:59

标签: java android synchronization thread-safety

我有一个带有两个线程使用的实例的类。从一个线程调用的方法是:

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:我在类加载器上检查了哈希,它在之前/之后是相同的。对象地址也是一样的。我还尝试在变量上放置一个字段断点。

1 个答案:

答案 0 :(得分:1)

第二个线程泄漏了对象的引用,因此在关闭/打开屏幕后,当重新创建Object时,线程具有不同的类实例。随后的测试中,线程的对象地址不同。