Java Android:是否可以只同步消费者而不同步生产者?
假设在下面的示例中,deleteItems consumer和addItem producer用于多个线程来删除项目并将其添加到映射中 我希望实现以下两个目标: 1当调用deleteItems时,将阻止任何要使用addItem的线程 2未调用deleteItems时,任何线程都可以使用addItem将新项目放入映射。由于效率问题,我不想同步附加项Java Android:是否可以只同步消费者而不同步生产者?,java,android,concurrency,synchronization,Java,Android,Concurrency,Synchronization,假设在下面的示例中,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();
}
}