为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2019-08-30 14:06:04
如果我有一个带有静态方法的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}
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


请记住,使用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) {...}

    }

}

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


查看完整回答
反对 回复 2019-08-30
?
繁花如伊

TA贡献2012条经验 获得超12个赞

static synchronized意味着对类的Class对象  synchronized持有锁定,这意味着锁定该类的对象本身。这意味着,如果要访问(执行)线程中的非静态同步方法,您仍然可以使用另一个线程访问静态同步方法。


因此,不可能在任何时间点通过多个线程访问两种相同类型的方法(两种静态方法或两种非静态方法)。


查看完整回答
反对 回复 2019-08-30
  • 3 回答
  • 0 关注
  • 427 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信