java - java.util.Stack 或 java.util.Queue 有什么线程安全问题

标签 java

如果我忽略 size() 的不准确性,并假设我分配了足够大的底层 Vector 以便不会发生重新分配,那么 java.util.Stack 或 java.util.Queue 有什么线程安全问题?

我想不出一个有效/合理的一致性论据来说明它们是线程不安全的。

有人有一些见解吗?

最佳答案

“线程安全”不是类的绝对属性——安全或不安全取决于您对对象的使用。您可以想出不安全的方式来使用 ConcurrentHashMap,也可以想出线程安全的方式来使用普通的 HashMap

当人们说一个类是线程安全的时,他们通常是指每个方法都是以线程安全的方式独立实现的。从这个意义上讲,Stack 是线程安全的。但它的接口(interface)不允许简单/安全地处理常见用例,因此从这个意义上说,它不是线程安全的。

例如,如果您的代码检查 Stack 不为空,如果是,则弹出一个元素——这是不安全的,因为它可能只有一个元素(因此不为空),但其他人在您有机会弹出它之前弹出了它(在这种情况下,您试图弹出一个空堆栈,并且会得到一个异常)。

为了更加线程安全,您确实需要一个方法来为您处理这种情况。 BlockingQueue给你那个。例如,take() 将阻塞,直到有一个值要弹出,而 poll() 将立即返回一个值,如果有,则返回 null没有要弹出的元素。

关于java - java.util.Stack 或 java.util.Queue 有什么线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107616/

相关文章:

java - 如何要求 JUnit 测试实现 @BeforeClass/@AfterClass "abstract method"?

java - spectj 将对象获取到切入点内

java - 将自定义 `DataType` 添加到 postgres-enum-typed `Binding` 时,Field 的 `TableField` 发生意外变化

java - 在堆栈计算器中计算负数

java - 如何通过断言失败

java - 如果 spring.beaninfo.ignore 设置为 true,Spring 会做什么?

java - 编程技巧: not able to modify variable before constructor call

java - 在Java中使用多线程读取数据

java - 在 SWT 中获取 CheckBoxTableViewer 中选中项的行索引

java - JBoss EAP 6.1 无法在 Eclipse Mars 中启动