同时检查堆栈是否为空

时间:2017-12-04 17:24:13

标签: java multithreading

如何确保在后续调用!stack.isEmpty() stack.pop()之间,不同的线程不会访问堆栈?

executor.submit(()->{
    File currentDirectory;
    while(!directoryToSearch.isEmpty()) {
        currentDirectory = directoryToSearch.pop(); 
        ....
    }
}

包装:

while ((currentDirectory = directoryToSearch.pop()) != null)

在try和catch块中或为已经同步的数据结构创建锁定根本不是一个好的解决方案。

在释放堆栈之前填充堆栈并且不会再次填满堆栈。我看到的问题是,在最后一个对象中,多个线程可能会通过stack.isEmpty()检查,其中一个线程能够弹出一个元素,从而导致所有其他线程的异常。

1 个答案:

答案 0 :(得分:0)

我建议使用ConcurrentLinkedQueue。它应该比同步和未来证明更快(如果你以后决定在一个线程中添加项目,而你将它们拉出来就可以了)。

第二种选择:抓住异常并继续,好像堆栈是空的。

这比同步更快,因为每当你进入同步块时,synchronized会有相当严重的惩罚,但异常只会在命中时导致速度问题(这只会发生在没有做任何有趣事情的线程上)。 p>

异常可能比ConcurrentLinkedQueue快一点,但只有一点点。