如果我忽略 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/