Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:是否可以只同步消费者而不同步生产者?_Java_Android_Concurrency_Synchronization - Fatal编程技术网

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

Java Android:是否可以只同步消费者而不同步生产者?,java,android,concurrency,synchronization,Java,Android,Concurrency,Synchronization,假设在下面的示例中,deleteItems consumer和addItem producer用于多个线程来删除项目并将其添加到映射中 我希望实现以下两个目标: 1当调用deleteItems时,将阻止任何要使用addItem的线程 2未调用deleteItems时,任何线程都可以使用addItem将新项目放入映射。由于效率问题,我不想同步附加项 有可能实现我想要的吗?如果我理解正确,你可能需要这样的东西: 您需要一个标志,使线程等待删除线程结束其作业。同样,要删除线程,它必须等待添加线程完成。

假设在下面的示例中,deleteItems consumer和addItem producer用于多个线程来删除项目并将其添加到映射中

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

1当调用deleteItems时,将阻止任何要使用addItem的线程

2未调用deleteItems时,任何线程都可以使用addItem将新项目放入映射。由于效率问题,我不想同步附加项


有可能实现我想要的吗?

如果我理解正确,你可能需要这样的东西:

您需要一个标志,使线程等待删除线程结束其作业。同样,要删除线程,它必须等待添加线程完成。这就是想法:

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();
   }

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


希望有帮助:祝你好运。

SparseIntArray是Map实现的一个子类吗?我是否也假设不能使用ConcurrenthashMap的实例。@WJS否,它不是Map的子类。ConcurrenthashMap呢?您可能希望编辑您的问题并解释您正在尝试做什么,而不是如何修复预期的解决方案。对于你的最终任务,可能有其他的方法。嗨,谢谢你的回答!但我关心的是,当addItem开始时,如果isDeleting为false,那么addItem中的while循环将通过。然后另一个线程执行deleteItems。此时,地图可以通过两个线程访问,一个是删除项目,另一个是添加项目。我理解您的担忧,也许我们应该在删除前检查。所以这是一个很好的例子,我们应该检查一下是否添加了内容,然后等待。让我写这封信,让我们再谈一次。@RichardHu我正在检查是否一切顺利,否则,我们必须更新我的答案,因为其他人也会搜索。Stackoverflow是关于记录员工的,因为其他人可能也会有同样的问题。谢谢
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();
   }

}