Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashmap在我的实现中是否需要同步?_Java_Concurrency_Thread Safety - Fatal编程技术网

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

Java ConcurrentHashmap在我的实现中是否需要同步?,java,concurrency,thread-safety,Java,Concurrency,Thread Safety,我遇到了一些麻烦,看看是否需要同步某些东西,我将向您展示我的示例解决方案。 我真的需要同步我的方法吗?还是会有更好的方法? 因为ConcurrentHashMap本身是线程安全的,所以出现了一个问题,因为我有两个,然后我认为我应该同步方法,以避免两个映射不同步,对吗 BookService用@Service注释,这意味着它是一个单例 @Service public class BookService { private final ConcurrentMap<String, UU

我遇到了一些麻烦,看看是否需要同步某些东西,我将向您展示我的示例解决方案。 我真的需要同步我的方法吗?还是会有更好的方法? 因为ConcurrentHashMap本身是线程安全的,所以出现了一个问题,因为我有两个,然后我认为我应该同步方法,以避免两个映射不同步,对吗

BookService用@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);
    }
}
@服务
公共类图书服务{
私有最终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了。在问题代码中,我看不到地图不一致的风险。也许在真实的代码中,你可能有,但也许没有。被接受和投票表决的答案是非常误导的,因为它让人觉得我们必须同步使用两个映射的任何方法。好的,明天我将发布另一个版本,这将使它更清楚。我删除了被接受的答案