我正在阅读"实践中的Java并发",并且作者说:"完全由线程安全类组成的程序可能不是线程安全的"。这怎么可能?我似乎不明白,有人可以提供一个例子吗?
答案 0 :(得分:7)
一个示例是类上的单个方法是线程安全的,但如果您调用多个方法,它们不是原子方法。 E.g。
if (!threadSafeCollection.contains(thing)) {
threadSafeCollection.add(thing);
}
如果另一个线程在此线程中的contains
和add
调用之间添加了集合,则可能会产生不正确的结果。
答案 1 :(得分:0)
为使这个问题更加清楚。
来自JCIP(声明1):
是一个完全由线程安全类构成的线程安全程序吗?不一定完全由线程安全类组成的程序可能不是线程安全的,线程安全程序可能包含不是线程安全的类。 PP 17
B Goetz定义为线程安全的是什么? (陈述2)
如果一个类在从多个线程访问时能够正确运行,则该线程是线程安全的,而与运行时环境对这些线程的执行进行调度或交织无关,并且在调用代码方面没有任何其他同步或其他协调。 PP 18
如果我们将语句1解释为意味着对完全线程安全的类进行调用的类本身不计入程序中的类集,则我对这两个语句的解释在一起才有意义。然后,可以构建一个具有先检查后行动问题的程序,该操作应该是原子操作,但不是,例如,在上述安迪·特纳的答案中。