同步静态方法在Java中如何工作?

问题:

如果我有一个使用静态方法的util类,它将调用Hibernate函数来完成基本的数据访问。我想知道如果使方法synchronized是确保线程安全的正确方法。
我想要阻止访问同一DB实例的信息。但是,我现在确定,如果以下代码阻止在特定类调用所有类时调用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
}

回答:

通过在静态方法锁上使用synchronized,您将synchronize the class methods and attributes(与实例方法和属性相反)
所以你的假设是正确的。

 I am wondering if making the method synchronized is the right approach to ensure thread-safety.

不是真的。您应该让该工作改为使用您的RDBMS。他们擅长这种东西。
通过同步访问数据库的唯一方法是使您的应用程序变得非常慢。此外,在您发布的代码中,您每次都在构建会话工厂,这样,您的应用程序将花费更多时间访问数据库,而不是执行实际的工作。
想象下面的情况:
客户端A和B尝试将不同的信息插入到表T的记录X中。
通过您的方法,您唯一需要确保的是在另一个之后被调用,当DB发生这种情况时,RDBMS将阻止它们同时从B插入一半的信息。结果将是相同的,但只有5倍(或更多)更慢。
可能会更好地看看Hibernate文档中的“Transactions and Concurrency”章节。大多数时候你想要解决的问题已经解决了,而且更好一些。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How do synchronized static methods work in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 6 = 2