gpt4 book ai didi

java - 多集群环境(weblogic集群)上的同步块(synchronized block)

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:38 25 4
gpt4 key购买 nike

我遇到的情况是,我只需要加载一次提供程序列表。所以我使用了同步块(synchronized block)。但在 weblogic 的多集群环境中失败了。有什么办法可以处理吗。这段代码在单个集群中运行良好。

public class AdditionalInfoImplProvider
{
private volatile boolean isLoaded = false;

private void ensureProviderLoaded()
{
if (!isLoaded) {
synchronized (this) {
if (!isLoaded) {
// Load Provider
isLoaded = true;
}
}
}
}
}

最佳答案

Java synchronized 关键字是一个单一的 jvm 概念。在集群中,有多个 JVM,因此所有这些都将在不同的 AdditionalInfoImplProvider 实例上同步,并且您的逻辑将在所有 Weblogic 实例中执行。

据我所知,标准JDK中没有提供这种同步。

单例设计模式在这里也不起作用,因为传统上单例意味着每个 JVM 而不是每个集群的单例。

处理这种情况的原始方法是在应用程序外部添加一些东西,例如锁定文件或 RDBMS 中的条目,无论谁先获得它 - 加载并退出即可。

您还可以查看 Weblogic 是否提供某种应用程序事件监听器 - 不特定于集群实例。

我没有使用过 Zookeeper,但听说有人将它用于您的用例。

引用this question就该主题进行更广泛的讨论。

总结是,您肯定需要一些在应用程序范围内存在的东西,并且每个 JVM 构造是不够的。

关于java - 多集群环境(weblogic集群)上的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49730680/

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