Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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中Set元素的同步_Java_Java 8_Synchronization - Fatal编程技术网

java中Set元素的同步

java中Set元素的同步,java,java-8,synchronization,Java,Java 8,Synchronization,我有一套独特的元素。每个元素都有一组可以执行的操作,但每个元素操作都独立于其他元素操作。例如,每个元素可以执行三个操作:O1、O2、O3。现在每个元素都可以执行O1、O2、O3,而不会与其他元素冲突。但在执行操作时,每个元件必须单独执行O1、O2、O3(一次一个) 在这种情况下,锁定元素是否是一种好方法。行吗?是否还有其他方法可以更好地做到这一点,例如使用ReentrantLock或使用java8 例如 for(Element element : elements) { synchronize

我有一套独特的元素。每个元素都有一组可以执行的操作,但每个元素操作都独立于其他元素操作。例如,每个元素可以执行三个操作: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() { ... }
}
这将确保对于
元素的给定实例
,一次只调用一个操作。您的呼叫者无需担心显式同步任何内容:

for(Element element : elements) {
  element.O1();
  element.O2();
  element.O3();
}
但是,如果您需要确保这些单独的操作(O1、O2和O3)同时发生,而不与其他可能的呼叫者交错,那么这将是不够的。在这种情况下,最安全的选择是在
元素
上引入新方法,以满足您的需要,而不是尝试在外部组合它们:

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

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

您可以
同步方法O1、O2和O3。我不喜欢上面的循环,因为1。任何其他调用方也必须记住,在调用其中一个方法之前,首先要进行同步。这将内部实现具体化。您使用集合的具体实现是什么?我使用的集合是从ConcurrentHashMap keySet派生的。
java.util.concurrent
中的类提供内存可见性保证,但不是在上面概述的情况下。如果必须以某种方式同步对象,则必须同步对象。任何其他方式都会给维护代码的人留下很大的陷阱。是否需要以独占方式执行整个序列
O1、O2、O3
,即在这些操作之间没有其他线程操纵对象?