是否有类似于copyonwritearraylist的copyonwritestack?

时间:2014-07-15 15:06:47

标签: java multithreading stack

我有两个带有全局堆栈变量的线程。 Thread1接收传入的消息并放入堆栈。线程2检查堆栈中是否有任何接收到的消息并进行处理。

但是,当我运行程序时,我收到这样的例外:

java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1

java.util.EmptyStackException
    at java.util.Stack.peek(Unknown Source)
    at java.util.Stack.pop(Unknown    

当我没有使用线程时,这些例外情况并未出现。但是,当我将程序转换为两个线程时突然出现了。是否有类似于copyonwritearraylist的copyonwritestack?

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

可能会抛出此异常,因为您选择的Stack实现不是线程安全

尝试使用实现ConcurrentLinkedDeque接口的Deque等堆栈的并发实现。

另外,正如文件中所述:

  

此接口[Deque]应优先于传统的Stack类使用。

答案 2 :(得分:0)

通常,对于消息传递,您使用队列,而不是堆栈。因为这涉及线程,比如BlockingQueue或ConcurrentLinkedQueue。这样做的原因是,如果生产者和消费者不以相同的速度运行,至少使用BlockingQueue,您可以防止永远堆积的消息。通常,队列可以保护您免受生产者位于消费者之前的情况的影响,并且堆栈底部的消息永远不会被弹出。