【发布时间】:2012-02-03 07:02:47
【问题描述】:
我不确定我现在是否真的需要这个,但如果我的应用程序扩展,我可以看到这种可能性。我基本上有一个围绕SharedPreferences 的包装器,它从SharedPreferences 中提取一些值并将它们捆绑到一个对象中。它还接受一个对象并使用它来更新首选项。我想让它成为线程安全的,但我想用信号量尝试它。我的SharedPreferences 包装器将从getSyncedPrefManager() 获得对以下类的引用。然后它将调用aquireLock(),然后调用getPref(),完成它的工作,然后调用releaseLock()。这看起来像是可行的方法还是我离谱?
public class SyncedPreferenceManager {
private final static SyncedPreferenceManager me =
new SyncedPreferenceManager();
private SharedPreferences prefs;
private static Semaphore mutex;
public static SyncedPreferenceManager getSyncedPrefManager(){
return me;
}
private SyncedPreferenceManager(){
mutex = new Semaphore(1, true);
}
public SharedPreferences getPref(Context caller){
if(prefs == null)
prefs = PreferenceManager.getDefaultSharedPreferences(caller);
return prefs;
}
public boolean aquireLock(){
try {
mutex.acquire();
} catch (InterruptedException e) {
return false;
}
return true;
}
public boolean releaseLock(){
mutex.release();
return true;
}
}
【问题讨论】:
-
我很好奇当您将此 SharedPreferences 支持的实现与您的 SQLite 实现进行比较时发现了什么。我进行了类似的测试,发现 SharedPreferences 比 SQLite 快大约 50 倍,所以我在不存储大量数据的任何地方都使用 SharedPreferences。
-
我不久前搬到了
SQLite系统,从那以后它的运行速度要快得多。但是,我几乎完全重写了该应用程序,因此可能是一些事情促成了这一点。在任何情况下,至少就我的目的而言,使用SQLite比使用SharedPreferences更容易(而且更“正确”)。
标签: java android concurrency thread-safety semaphore