java - 我怎样才能同步类,以便我可以从 UI 线程和后台线程使用?

标签 java android multithreading concurrency

我有一个实用类如下:

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/

相关文章:

java - GWT DateTimeFormat 解析以提供 DateBox

java - 导出后 URL 不应包含 Servlet 名称

android - 更新 firebase 构建版本后无法运行该应用程序

c# - 是否有并发无锁阻塞队列的实现?

c# - 告诉正在执行循环的线程跳出循环并执行其他操作的正确方法是什么?

c++ - 成员变量在另一个线程中没有改变?

java - 有没有办法覆盖 JPA 中实体子类中的 ID?

java - 在 onBindviewHolder 中使用不带循环的标签

android 通知一项 Activity 和另一项 Activity 的最佳方法

Android 自动完成 TextView : How to verify if a user has selected a suggested value or entered a new one?