在 Java 中对 Set 元素进行同步



我有一组独特的元素。每个元素都有一组可以执行的操作,但每个元素操作都独立于其他元素操作。例如,有三个操作: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 所建议的那样,最安全的选择可能是使您的操作synchronized,而不是依赖所有调用者来正确执行此操作,例如:

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()中的所有内容都将相对于此时刻的任何其他调用以原子方式发生。

最新更新