【发布时间】:2017-06-22 05:22:02
【问题描述】:
我有一个下面的方法,我想在以下条件下执行:
- 这个方法应该只执行一次。一旦它被执行,它就不能再次执行,所以如果有人试图再次执行,它应该通过记录一些有用的错误消息
already executed或任何有用的东西来返回。 - 而且它只能由一个线程执行。那么如果多个线程在调用下面的方法,那么它应该只被一个线程调用,其他线程应该等待初始化完成?
下面是我的方法:
public void initialize() {
List<Metadata> metadata = getMetadata(true);
List<Process> process = getProcess();
if (!metadata.isEmpty() && !process.isEmpty()) {
Manager.setAllMetadata(metadata, process);
}
startBackgroundThread();
}
这可能吗?我正在使用 Java 7。
【问题讨论】:
-
如果你想确保一段代码只执行一次,我认为将它放在 Enum 的类静态初始化程序中是尽可能接近的。 JVM 保证每个类加载器最多调用一次。但比这更好的是,我认为没有明确的方法可以提供这样的保证。如果您提供有关您的用例的更多信息,也许可以?
-
我在我的一个类中有这个方法,它初始化我们所有的元数据,一旦初始化完成,那么我只想在我的应用程序中继续前进。
-
把它放在这个类的静态初始化器中不够吗?
-
为什么不设置哪个键是调用者线程ID?
-
如果是实例级别,我会使用双重检查锁定,如果是类级别,我会使用按需初始化持有者惯用语。我更喜欢前者并使用 Guava 的
Suppliers.memoize()来封装 DCL 逻辑。
标签: java multithreading concurrency