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