java中Set元素的同步
我有一套独特的元素。每个元素都有一组可以执行的操作,但每个元素操作都独立于其他元素操作。例如,每个元素可以执行三个操作:O1、O2、O3。现在每个元素都可以执行O1、O2、O3,而不会与其他元素冲突。但在执行操作时,每个元件必须单独执行O1、O2、O3(一次一个) 在这种情况下,锁定元素是否是一种好方法。行吗?是否还有其他方法可以更好地做到这一点,例如使用ReentrantLock或使用java8 例如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
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
,即在这些操作之间没有其他线程操纵对象?