gpt4 book ai didi

java - 同步代码块是只阻塞赋值还是阻塞整个 block 体?

转载 作者:行者123 更新时间:2023-12-03 23:18:34 30 4
gpt4 key购买 nike

我有一个数据变量,monthArray,它被多个消费者读取,并由单个定期更新程序线程定期更新数据。全部异步。

我已经考虑了这两个选项来安全地执行更新。

    ArrayList<String> tempArray = ModelJob.getDistinctMonths(user, true);       
synchronized (monthArray) {
monthArray = tempArray;
}

    synchronized (monthArray) {
monthArray = ModelJob.getDistinctMonths(user, true);
}

第一个背后的想法是 ModelJob.getDistinctMonths(user, true); 调用很耗时,我不想让同步阻塞的时间比它必须阻塞的时间长,只是用于使用更新后的数组快速重新分配旧数组。然而似乎是一个混淆,我只想在完全必要的情况下这样做。任何人都可以让我深入了解 jvm 如何处理这种同步和天气,或者不做前者会让我提高性能吗?基本上我问的是 jvm 是否会阻塞整个静态 ModelJob 调用,或者它是否能够通过仅阻塞重新分配并安全地逃脱,如果是这样,那么这样做是否足够聪明。

最佳答案

假设您不需要 getDistinctMonths() 调用的同步(该调用是线程安全的,并且您不需要调用的原子性和赋值),那么你可以围绕赋值进行同步(是的,阻塞的范围仅限于同步块(synchronized block),否则语法将毫无意义)。请注意,@JohnVint 提出了一个很好的观点,即您不应在 monthArray 引用上进行同步,因为它正在被修改。您必须在一个不会更改的单独对象实例上进行同步。

最后,您可以删除同步块(synchronized block)并使 monthArray 成员可变并获得相同的结果。

关于java - 同步代码块是只阻塞赋值还是阻塞整个 block 体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11524187/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com