Android:是否可以只同步消费者而不同步生产者?

时间:2021-03-26 12:29:55

标签: java android concurrency synchronization

假设在下面的例子中,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

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

1 个答案:

答案 0 :(得分: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();
   }

}

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

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