程序如何仅包含线程安全的类,但不是线程安全的?

Cod*_*Man 3 language-agnostic concurrency multithreading

我正在阅读"实践中的java并发",作者说:"一个完全由线程安全类组成的程序可能不是线程安全的".这怎么可能?我似乎不明白,有人可以提供一个例子吗?

And*_*ner 7

一个示例是类上的单个方法是线程安全的,但如果您调用多个方法,它们不是原子方法.例如

if (!threadSafeCollection.contains(thing)) {
  threadSafeCollection.add(thing);
}
Run Code Online (Sandbox Code Playgroud)

如果另一个线程添加到此线程中的调用containsadd调用之间的集合,则可能会产生不正确的结果.