通过查看是否需要同步某些内容我遇到了一些麻烦,我将向您展示我的示例解决方案。我真的需要同步我的方法吗?或者会有更好的方法吗?因为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()方法根据你放在另一个地图中的内容改变了一个地图的状态,你就会遇到竞争条件,在这种情况下,需要进行外部同步。