ConcurrentHashmap在我的实现中是否需要同步?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentHashmap在我的实现中是否需要同步?相关的知识,希望对你有一定的参考价值。

通过查看是否需要同步某些内容我遇到了一些麻烦,我将向您展示我的示例解决方案。我真的需要同步我的方法吗?或者会有更好的方法吗?因为ConcurrentHashMap本身就是线程安全的,所以问题就出现了,因为我有两个,然后我想我应该同步方法不要让两个地图不同步,对吧?

Book Service使用@Service注释,这意味着它是一个单例。

@Service
public class BookService {

    private final ConcurrentMap<String, UUID> codeToUUIDs;
    private final ConcurrentMap<Book, String> bookToCodes;

    public BookService() {
        this.bookToCodes = fillBookCodes();
        this.codeToUUIDs = new ConcurrentHashMap<>();
    }

    public synchronized UUID add(Book book) {
        final String randomCode = bookToCodes.putIfAbsent(book, "randomCode");
        return codeToUUIDs.get(randomCode);
    }

    public synchronized UUID get(String code) {
        return codeToUUIDs.get(code);
    }
}
答案

由于两个地图都需要同步,因此您需要使用synchronized方法。

但由于您的方法已经同步,因此您不需要ConcurrentMaps。通常的HashMaps是可以的。

另一答案

仅当您的竞争条件可能会在地图内容中产生不希望的不一致时,才能同步对地图的访问。 即使使用单个地图也可能是这种情况。

实际上你在get()和add()方法中没有任何竞争条件。所以同步是无助的。

假设add()方法根据你放在另一个地图中的内容改变了一个地图的状态,你就会遇到竞争条件,在这种情况下,需要进行外部同步。

以上是关于ConcurrentHashmap在我的实现中是否需要同步?的主要内容,如果未能解决你的问题,请参考以下文章

ConcurrentHashMap底层实现#yyds干货盘点#

ConcurrentHashMap:按条件删除

ConcurrentHashMap源码分析

浅析HashMap与ConcurrentHashMap的线程安全性

ConcurrentHashMap 的例子

HashMap和ConcurrentHashMap实现原理及源码分析