gpt4 book ai didi

java - 同步静态方法在 android 中不起作用?

转载 作者:行者123 更新时间:2023-11-30 03:04:46 27 4
gpt4 key购买 nike

我有一个类需要是单例:

private static StationsFile instance;
private Context ctx;

protected StationsFile(Context ctx){
this.ctx = ctx;

load();
}
public static synchronized StationsFile getInstance(Context ctx){
if(instance == null){
Log.d("StationsFile", "set instance " + StationsFile.class.hashCode());
instance = new StationsFile(ctx);
Log.d("StationsFile", "instance set " + instance.hashCode());
}
return instance;
}
protected static StationsFile getInstance(){
return getInstance(null);
}

private void load(){
if(externalStorageIsReadable()){
// Loads from sd file
}else{
loadDefaults();
}
}

private void loadDefaults(){
if(this.ctx != null){
// Load from raw file in raws folder (I need a context to access Resources)
}else{
// Hardcoded default here
}
}

现在,由于此方法是同步的并且是静态的,因此一次只能调用一次。当我在我的设备(Android 4.4)中运行它时没有问题(在我的日志中我得到“set instance - instance set”),但是当我第一次(并且是安装后的第一次)在 Android 中运行它时2.2 虚拟设备或每次在 Android 4.4 虚拟设备中,我都会在日志中看到“set instance - set instance - instance set - instance set”,并因此发生崩溃。

所以看起来当启动“慢”时它会崩溃。在我看来,synchronized 关键字似乎不起作用。

此方法在应用程序一开始就从 2 个不同的线程中调用。一个线程从 Internet 下载并解析文件,因此它得到更新,而另一个线程(主线程)只是读取它。 (我不需要一个发生在另一个之前,因为如果它不是从互联网加载的,它只是从内部存储器中读取它)。

这是虚拟设备的错误吗?我的意思是,因为它是同步的(据我所知),所以不能同时调用两次。我该如何解决这个问题?

编辑:重构我的类并使其遵循单例模式神奇地修复了它。在我拥有访问 getInstance 的公共(public)静态方法之前,“我不必将 getInstance 放在任何我想调用此类的地方”。尽管如此,我将回滚我的代码以找出问题所在(我正在使用 git 存储库)。

Edit2:使用哈希码,我得到日志:“set instance 1139286928 - set instance 1139286928 - instance set 1139224312 - instance set 1139287568”

Edit3:发现错误。问题是,当他将文件加载到 Resourcers 文件夹中时,方法 loadDefaults 再次使用 getInstance() 解析该文件(调用我拥有的 loadFromString 方法)。我以为这是两个不同的线程,但它是同一个,因此为什么同步对它没有任何影响。

最佳答案

试试这个...

// initialized when the class is loaded for the first time
private static final StationsFile instance = new StationFile();

public static StationsFile getInstance() {
return instance; // no need of null check here. No worry about synchronization
}

你可能会明白区别是什么......

关于java - 同步静态方法在 android 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21984880/

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