在使用java.util.concurrent类时,我应该同步以避免可见性问题吗?

Mir*_*tta 5 java concurrency multithreading java.util.concurrent java-memory-model

使用任何java.util.concurrent类时,是否仍需要在实例上同步访问以避免差异线程之间的可见性问题?

详细阐述这个问题

当使用java.util.concurrent的实例时,是否有可能一个线程修改实例(即,将一个元素放在一个并发的hashmap中),后续的线程将不会看到修改?

我的问题源于这样一个事实:如果对值的访问不同步,Java内存模型允许线程缓存值而不是直接从内存中获取它们.

Tom*_*ros 3

在 java.util.concurrent 包Memory Consistency Properties上,您可以检查该包的 Javadoc API:

java.util.concurrent 及其子包中所有类的方法将这些保证扩展到更高级别的同步。尤其:

  • 将对象放入任何并发集合之前的线程中的操作 发生在另一个线程中从集合中访问或删除该元素之后的操作之前。
    [...]
  • “释放”同步器方法(例如
    Lock.unlock、Semaphore.release 和
    CountDownLatch.countDown)
    之前的操作发生在成功“获取”方法(例如 Lock.lock、Semaphore.acquire、Condition.await 和 CountDownLatch)之后的操作.await 另一个线程中的同一个同步器对象。
    [...]

因此,这个包中的类利用一组线程控制类(LockSemaphore等)来确保并发性。此类以编程方式处理发生前逻辑,即管理并发线程的 FIFO 堆栈、锁定和释放当前和后续线程(即使用Thread.wait()Thread.resume()等)。

然后,(理论上)您不需要同步访问此类的语句,因为它们以编程方式控制并发线程访问。