gpt4 book ai didi

java - 跨集群共享 Java 同步块(synchronized block),还是使用全局锁?

转载 作者:太空狗 更新时间:2023-10-29 22:46:13 30 4
gpt4 key购买 nike

我有一些代码只允许一个线程访问。我知道如何使用 synchronized block 或方法来完成此操作,但这是否适用于集群环境?

目标环境为WebSphere 6.0,集群中有2个节点。

我觉得 synchronized 行不通,因为每个节点上的每个应用程序实例都有自己的 JVM,对吧?

我在这里尝试做的是在系统启动时对数据库记录执行一些更新。它将查找比代码版本更旧的任何数据库记录,并执行特定任务来更新它们。我只希望一个节点执行这些升级,因为我想确保每个工作项只升级一次,并且这些升级的性能不是一个大问题,因为它只发生在应用程序启动时,它只真正做任何事情自上次启动后代码发生更改时。

数据库是DB2v9,我是直接通过JNDI访问的(没有ORM层)。

有人建议全局锁可能是这里的方法,但我不确定该怎么做。

有人在这个领域有任何指示吗?

谢谢!

最佳答案

是的,您是正确的,同步 block 不会跨集群工作。正如您所说,原因是每个节点都有自己的 JVM。

但是,有一些方法可以让同步块(synchronized block)在集群中工作,就像它们在单节点环境中工作一样。最简单的方法是使用类似 Terracotta 的产品,它将处理不同 JVM 之间线程的协调,以便可以在集群中使用正常的并发控制。有很多文章解释了它是如何工作的,比如 Introduction to OpenTerracotta .

当然还有其他解决方案。这主要取决于您真正想在这里实现的目标。如果您需要扩展,我不会使用数据库锁进行同步,因为数据库不需要。但我真的敦促你找到一个现成的解决方案,因为乱搞集群同步是一件很麻烦的事:)

关于java - 跨集群共享 Java 同步块(synchronized block),还是使用全局锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1228833/

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