如何确保在后续调用!stack.isEmpty()和 stack.pop()之间,不同的线程不会访问堆栈?
executor.submit(()->{
File currentDirectory;
while(!directoryToSearch.isEmpty()) {
currentDirectory = directoryToSearch.pop();
....
}
}
包装:
while ((currentDirectory = directoryToSearch.pop()) != null)
在try和catch块中或为已经同步的数据结构创建锁定根本不是一个好的解决方案。
在释放堆栈之前填充堆栈并且不会再次填满堆栈。我看到的问题是,在最后一个对象中,多个线程可能会通过stack.isEmpty()检查,其中一个线程能够弹出一个元素,从而导致所有其他线程的异常。
答案 0 :(得分:0)
我建议使用ConcurrentLinkedQueue。它应该比同步和未来证明更快(如果你以后决定在一个线程中添加项目,而你将它们拉出来就可以了)。
第二种选择:抓住异常并继续,好像堆栈是空的。
这比同步更快,因为每当你进入同步块时,synchronized会有相当严重的惩罚,但异常只会在命中时导致速度问题(这只会发生在没有做任何有趣事情的线程上)。 p>
异常可能比ConcurrentLinkedQueue快一点,但只有一点点。