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

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

}


慕森卡
浏览 430回答 3
3回答

慕运维8079593

更一般地解决这个问题......请记住,使用synchronized on方法实际上只是简写(假设类是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) {...}    }}(对于非静态方法,您可能希望将锁定为非静态字段)

繁花如伊

static synchronized意味着对类的Class对象  synchronized持有锁定,这意味着锁定该类的对象本身。这意味着,如果要访问(执行)线程中的非静态同步方法,您仍然可以使用另一个线程访问静态同步方法。因此,不可能在任何时间点通过多个线程访问两种相同类型的方法(两种静态方法或两种非静态方法)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java