如果我有一个带有静态方法的 util 类,它将调用 Hibernate 函数来完成基本数据访问。我想知道制作该方法synchronized是否是确保线程安全的正确方法。
synchronized
我希望这可以防止信息访问同一个数据库实例。但是,我现在确定以下代码是否阻止getObjectById在特定类调用时为所有类调用。
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 }
通过在静态方法锁上使用同步,您将同步类方法和属性(而不是实例方法和属性)
所以你的假设是正确的。
我想知道使方法同步是否是确保线程安全的正确方法。
并不真地。您应该让您的 RDBMS 代替它来完成这项工作。他们擅长这种东西。
通过同步对数据库的访问,你唯一能得到的就是让你的应用程序变得非常慢。此外,在您发布的代码中,您每次都在构建一个会话工厂,这样,您的应用程序将花费更多时间访问数据库而不是执行实际工作。
想象以下场景:
客户端 A 和 B 尝试将不同的信息插入到表 T 的记录 X 中。
使用您的方法,您得到的唯一一件事就是确保一个接一个地被调用,当这种情况无论如何都会在数据库中发生时,因为 RDBMS 将阻止他们同时插入来自 A 的一半信息和来自 B 的一半信息. 结果将相同,但仅慢 5 倍(或更多)。
可能最好看一下 Hibernate 文档中的“事务和并发”一章。大多数时候,你试图解决的问题已经解决了,而且是一种更好的方法。