Java ConcurrentHashmap在我的实现中是否需要同步?
我遇到了一些麻烦,看看是否需要同步某些东西,我将向您展示我的示例解决方案。 我真的需要同步我的方法吗?还是会有更好的方法? 因为ConcurrentHashMap本身是线程安全的,所以出现了一个问题,因为我有两个,然后我认为我应该同步方法,以避免两个映射不同步,对吗 BookService用@Service注释,这意味着它是一个单例Java ConcurrentHashmap在我的实现中是否需要同步?,java,concurrency,thread-safety,Java,Concurrency,Thread Safety,我遇到了一些麻烦,看看是否需要同步某些东西,我将向您展示我的示例解决方案。 我真的需要同步我的方法吗?还是会有更好的方法? 因为ConcurrentHashMap本身是线程安全的,所以出现了一个问题,因为我有两个,然后我认为我应该同步方法,以避免两个映射不同步,对吗 BookService用@Service注释,这意味着它是一个单例 @Service public class BookService { private final ConcurrentMap<String, UU
@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);
}
}
@服务
公共类图书服务{
私有最终ConcurrentMap代码指南;
私有最终ConcurrentMap bookToCodes;
公共图书服务(){
this.bookToCodes=fillBookCodes();
this.codetouids=新的ConcurrentHashMap();
}
公共同步UUID添加(书本){
最后一个字符串randomCode=bookToCodes.putIfAbsent(book,“randomCode”);
返回codetouids.get(随机码);
}
公共同步UUID get(字符串代码){
返回codetouids.get(code);
}
}
由于两个贴图都需要同步,因此需要使用同步的方法
但是由于您的方法已经同步,所以这里不需要ConcurrentMaps。通常的HashMaps是可以的。因为两个映射都需要同步,所以需要使用同步的方法
但是由于您的方法已经同步,所以这里不需要ConcurrentMaps。通常的哈希映射是可以的。只有当您有可能在映射内容中造成不希望的不一致的竞争条件时,才能同步对映射的访问。
即使使用一张地图,情况也可能如此
实际上,get()和add()方法中没有任何竞争条件。所以同步是无助的
假设add()方法根据您在另一个映射中放置的内容更改了一个映射的状态,您将有一个竞争条件,在这种情况下,将需要外部同步 只有当您有可能在地图内容中造成不希望的不一致的竞争条件时,才能同步对地图的访问。
即使使用一张地图,情况也可能如此
实际上,get()和add()方法中没有任何竞争条件。所以同步是无助的
假设add()方法根据您在另一个映射中放置的内容更改了一个映射的状态,您将有一个竞争条件,在这种情况下,将需要外部同步 您是否有代码要添加到codetouids
?因为如果不需要,就不需要同步,只需返回null
。这取决于您的需要。如果从方法中删除synchronized
,则该代码不会引发任何并发的mod异常或其他奇怪的访问问题,但可能是在get
过程中,某本书在bookToCodes
中,但尚未在codetouids
中。如果没有问题,则可以从方法中删除synchronized
,但如果希望BookService
的操作是原子的,则保持同步。根据提供的代码,我认为没有必要进行同步
,但我不确定是否还有更多内容。谢谢,还有更多内容,我只是根据我今天所做的事情制作了一个简短的示例,并进行了简化,我想知道如何才能做得更好。但是需要两种方法同步,然后我就不需要concurrentMaps了。在问题代码中,我看不到地图不一致的风险。也许在真实的代码中,你可能有,但也许没有。被接受和投票表决的答案是非常误导的,因为它让人觉得我们必须同步使用两个映射的任何方法。好的,明天我将发布另一个版本,这将使它更清楚。我删除了接受的答案您是否有代码要添加到codetouids
?因为如果不需要,就不需要同步,只需返回null
。这取决于您的需要。如果从方法中删除synchronized
,则该代码不会引发任何并发的mod异常或其他奇怪的访问问题,但可能是在get
过程中,某本书在bookToCodes
中,但尚未在codetouids
中。如果没有问题,则可以从方法中删除synchronized
,但如果希望BookService
的操作是原子的,则保持同步。根据提供的代码,我认为没有必要进行同步
,但我不确定是否还有更多内容。谢谢,还有更多内容,我只是根据我今天所做的事情制作了一个简短的示例,并进行了简化,我想知道如何才能做得更好。但是需要两种方法同步,然后我就不需要concurrentMaps了。在问题代码中,我看不到地图不一致的风险。也许在真实的代码中,你可能有,但也许没有。被接受和投票表决的答案是非常误导的,因为它让人觉得我们必须同步使用两个映射的任何方法。好的,明天我将发布另一个版本,这将使它更清楚。我删除了被接受的答案