小编典典

同步静态方法在 Java 中是如何工作的,我可以用它来加载 Hibernate 实体吗?

all

如果我有一个带有静态方法的 util 类,它将调用 Hibernate
函数来完成基本数据访问。我想知道制作该方法synchronized是否是确保线程安全的正确方法。

我希望这可以防止信息访问同一个数据库实例。但是,我现在确定以下代码是否阻止getObjectById在特定类调用时为所有类调用。

public class Utils {
     public static synchronized Object getObjectById (Class objclass, Long id) {
           // call hibernate class
         Session session = new Configuration().configure().buildSessionFactory().openSession();
         Object obj = session.load(objclass, id);
         session.close();
         return obj;
     }

     // other static methods
}

阅读 90

收藏
2022-07-31

共1个答案

小编典典

通过在静态方法锁上使用同步,您将同步类方法和属性(而不是实例方法和属性)

所以你的假设是正确的。

我想知道使方法同步是否是确保线程安全的正确方法。

并不真地。您应该让您的 RDBMS 代替它来完成这项工作。他们擅长这种东西。

通过同步对数据库的访问,你唯一能得到的就是让你的应用程序变得非常慢。此外,在您发布的代码中,您每次都在构建一个会话工厂,这样,您的应用程序将花费更多时间访问数据库而不是执行实际工作。

想象以下场景:

客户端 A 和 B 尝试将不同的信息插入到表 T 的记录 X 中。

使用您的方法,您得到的唯一一件事就是确保一个接一个地被调用,当这种情况无论如何都会在数据库中发生时,因为 RDBMS 将阻止他们同时插入来自 A
的一半信息和来自 B 的一半信息. 结果将相同,但仅慢 5 倍(或更多)。

可能最好看一下 Hibernate
文档中的“事务和并发”一章。大多数时候,你试图解决的问题已经解决了,而且是一种更好的方法。

2022-07-31