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

问题描述 投票:0回答:2

通过查看是否需要同步某些内容我遇到了一些麻烦,我将向您展示我的示例解决方案。我真的需要同步我的方法吗?或者会有更好的方法吗?因为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);
    }
}
java concurrency thread-safety
2个回答
4
投票

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

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.