gpt4 book ai didi

java - 屏幕关闭/打开后,同步(和 volatile )无法按预期工作

转载 作者:行者123 更新时间:2023-12-02 11:38:19 25 4
gpt4 key购买 nike

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

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 来表示状态,然后就转到了synchronized。 onF1 方法中 state 不为 1 的任何线索吗?

编辑1:我检查了类加载器上的哈希值,前后是相同的。对象地址也相同。我还尝试在变量上放置一个字段断点。

最佳答案

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

关于java - 屏幕关闭/打开后,同步(和 volatile )无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com