我有一个实用类如下:
public class MetaUtility {
private static final SparseArray<MetaInfo> metaInfo = new SparseArray<>();
public static void flush() {
metaInfo.clear();
}
public static void addMeta(int key, MetaInfo info) {
if(info == null) {
throw new NullPointerException();
}
metaInfo.append(key, info);
}
public static MetaInfo getMeta(int key) {
return metaInfo.get(key);
}
}
这个类非常简单,我希望有一个“中央”容器可以跨类/Activity 使用。
问题是线程。
现在它仅在代码中的 1 个位置(而不是在 UI 线程中)被填充(即调用 addMeta
)并且不会改变。
getter 由 UI 线程访问,在某些情况下由后台线程访问。
仔细查看代码,我认为我不会遇到这样的情况:后台线程将元素添加到稀疏数组,而其他线程会尝试访问它。
但这对于一个人来说是非常棘手的,除非他非常了解代码。
我的问题是,我如何设计我的类,以便我可以从包括 UI 线程在内的所有线程安全地使用它?
我不能只添加同步或使其阻塞,因为那样会阻塞 UI 线程。我能做什么?
最佳答案
你应该只在你的对象上同步,因为你的类现在只是一个围绕 SparseArray 的包装类。如果存在线程级阻塞问题,则可能是由于在项目的其他部分滥用了该对象(好吧,我猜类认为它只公开公共(public)静态方法)。
关于java - 我怎样才能同步类,以便我可以从 UI 线程和后台线程使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800488/