文档说ehcache是线程安全的。因此,据我所知,如果thread A更新缓存,这些更新将始终对其他线程可见。
但是我想知道putAll操作是否线程安全和原子化?比方说,我只想通过调用putAll并传递一个具有实际值的Map来更新缓存。比方说,我希望在更新缓存时从缓存中获得一些值。我会接收旧值还是等待缓存更新并接收新值?
发布于 2016-08-27 15:38:31
当操作只能完全执行或根本不执行时,操作是原子的。根据接口Ehcache,putAll操作不是原子操作。
如果集合中遇到一个空元素或空键,则此方法将抛出一个NullPointerException,并且可能会导致部分完成(因为可能只放置了一些元素)。
关于ehcache是否是线程安全的问题。Ehcache是专为线程安全设计的。以缓存实现为例。
缓存是线程安全。
但是小心线程安全并不意味着同步。那有什么区别?
Threadsafe意味着一个类可以从多个线程中使用,没有任何错误或问题。
同步意味着只能从一个线程同时使用一个或多个方法。
在putAll的情况下,这意味着什么,让我们说一个get调用。这两种方法都是线程安全的,但它们不是同步的。
因此,您无法确定线程A是否调用putAll,线程B随后是否调用get,putAll是否在get之前执行。
https://stackoverflow.com/questions/39107727
复制相似问题