gpt4 book ai didi

java - java中Set元素的同步

转载 作者:搜寻专家 更新时间:2023-11-01 03:46:46 25 4
gpt4 key购买 nike

我有一组独特的元素。每个元素都有一组它可以执行的操作,但每个元素操作都独立于其他元素操作。例如,每个元素可以执行三个操作:O1、O2、O3。现在每个元素都可以执行 O1、O2、O3 而不会与其他元素发生冲突。但是每个元素在执行操作时都必须独占地执行O1、O2、O3(一次一个)。

在那种情况下,锁定元素是不是一个好方法。它会工作吗?是否还有其他方法,例如使用 ReentrantLock 或使用 java8 以更好的方式执行此操作?

例如

for(Element element : elements) {
synchronized(element) {
//Perform O1,O2,O3 but one at a time
}
}

假设上面的for循环可以从多个地方调用,这个for循环写在一段代码的多个地方,对一个元素执行不同的操作。

最佳答案

正如 markspace 所建议的,最安全的选择可能是使您的操作同步,而不是依赖所有调用者正确地这样做,例如:

public class Element {
public synchronized void O1() { ... }
public synchronized void O2() { ... }
public synchronized void O3() { ... }
}

这将确保对于给定的 Element 实例,一次只调用一个操作。然后,您的调用者无需担心显式同步任何内容:

for(Element element : elements) {
element.O1();
element.O2();
element.O3();
}

但是,如果您需要确保这些单独的操作(O1、O2 和 O3)全部一起发生,而不与其他可能的调用者交错,那么这还不够。在这种情况下,最安全的选择是在 Element 上引入新方法来满足您的需要,而不是尝试在外部组合它们:

public class Element {
// ...
public synchronized void doAllOperations() { O1(); O2(); O3(); }
}

这确保 doAllOperations() 中的所有内容都将相对于此时此刻的任何其他调用以原子方式发生。

关于java - java中Set元素的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48334764/

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