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

标签 java multithreading hibernate concurrency synchronization

如果我有一个带有静态方法的 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
}

最佳答案

为了更一般地解决这个问题......

请记住,在方法上使用同步实际上只是简写(假设类是 SomeClass):

synchronized static void foo() {
    ...
}

相同
static void foo() {
    synchronized(SomeClass.class) {
        ...
    }
}

synchronized void foo() {
    ...
}

相同
void foo() {
    synchronized(this) {
        ...
    }
}

您可以使用任何对象作为锁。如果你想锁定静态方法的子集,你可以

class SomeClass {
    private static final Object LOCK_1 = new Object() {};
    private static final Object LOCK_2 = new Object() {};
    static void foo() {
        synchronized(LOCK_1) {...}
    }
    static void fee() {
        synchronized(LOCK_1) {...}
    }
    static void fie() {
        synchronized(LOCK_2) {...}
    }
    static void fo() {
        synchronized(LOCK_2) {...}
    }
}

(对于非静态方法,您可能希望将锁设为非静态字段)

关于java - 同步静态方法在 Java 中是如何工作的,我可以用它来加载 Hibernate 实体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/578904/

相关文章:

java - 从被调用方传递的参数但在方法定义中为 null

java - 跨域/领域身份验证

php - 在PHP中最后sem_release之后删除信号量

java - "putIfAbsent"在CHM中如何工作?

java - 使用Hibernate框架

java - 带有 Hibernate 的 Jasper - 找不到实体类

java - 中断调用后线程在中断调用时返回 false

Java:当方法位于子类且参数为父类(super class)类型时,绕过 "The method abc is undefined for the type X"

java - Tomcat中两个war之间的互通

java - 后台线程的 JDBC 连接在 Websphere 中关闭访问