【问题标题】:Android: is it possible to only synchronize consumer but not producer?Android:是否可以只同步消费者而不同步生产者?
【发布时间】:2021-06-23 06:51:58
【问题描述】:

假设在以下示例中,deleteItems(消费者)和addItem(生产者)用于多个线程删除和添加项目到map

class Test {
   public static SparseIntArray map = new SparseIntArray();
   
   // deleteItems is invoked every 10 seconds
   public static void deleteItems() {
       synchronized(Test.class) {
           // Iterate over the items in the map and delete some
       }
   }

   // addItem is invoked frequently
   public static void addItem(int key, int value) {
       // Add an item into the map
   }
}

我希望实现以下两个目标:

(1) 当deleteItems被调用时,任何将要使用addItem的线程都会被阻塞。

(2) 当deleteItems 未被调用时,任何线程都可以使用addItem 将新项目放入map。 (因为效率问题我不想同步addItem

有没有可能实现我想要的?

【问题讨论】:

  • SparseIntArrayMap 实现的子类吗?我是否也假设无法使用ConcurrenthashMap 的实例。
  • @WJS 不,它不是 Map 的子类。
  • ConcurrenthashMap 呢?您可能想要编辑您的问题并解释您正在尝试做什么,而不是如何修复预期的解决方案。您的最终任务可能有其他方法。

标签: java android concurrency synchronization


【解决方案1】:

所以也许(如果我理解正确的话)你需要这样的东西:

您需要一个标志,让线程等待直到删除线程结束其工作。 “删除”线程也是如此,它必须等待添加线程完成。所以这就是想法:)

class Test {
   private SparseIntArray map = new SparseIntArray();
   private boolean isDeleting = false; 
   private int threadsAdding = 0;
   
   public synchronized void deleteItems() {
       while(threadsAdding != 0) { wait(); }

       isDeleting = true;
       ...
       exitDeleting();
   }

   public void addItem(int key, int value) throws InterruptedException {
       while (isDeleting) { wait(); }

       threadsAdding++;
       ...
       exitAdding();
   }

   private void exitDeleting() {
       isDeleting = false;
       notifyAll();
   }

   private void exitAdding() {
       threadsAdding--;
       notifyAll();
   }

}

如果我遗漏了什么,请告诉我,以便我们讨论。

希望它有所帮助:) 祝你好运。

【讨论】:

  • 您好,感谢您的回答!但是我担心如果addItem 开始时isDeleting 为假,那么addItem 中的while 循环将会通过。然后另一个线程执行deleteItems。此时,地图可以被两个线程访问,一个是删除项,一个是添加项。
  • 我理解您的担忧,也许我们应该在删除前检查。所以这是一个很好的极端案例,我们应该检查是否添加东西并等待。让我写这个,让我们再说一遍。
  • @RichardHu 如果一切顺利,我正在检查,否则,我们必须更新我的答案,因为其他人也会搜索。 Stackoverflow 都是关于记录员工的,因为其他人可能会遇到同样的问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多