使用synchronized(锁定)时,锁定对象最好是静态还是非静态?

时间:2012-01-08 00:48:48

标签: java synchronization

使用这样的东西时:

private final Object lock = new Object()

静态和非静态之间有什么区别吗?

非静态对象可以锁定静态方法,反之亦然?

3 个答案:

答案 0 :(得分:3)

如果您使用的是非静态锁定,则该对象的每个实例都会有一个不同的锁定对象,并且它可能是一个更细粒度的等效调用:

synchronized(this) {

}

也就是说:您只能锁定同一对象内的其他访问。使用静态锁定时,类的每个实例都共享锁定对象。因此,在任何给定时间只有一个线程可以访问同步块。

所以这取决于你在做什么。在前一种情况下,除非您有多个锁保护较小的数据子集,否则无需分配锁对象。在后一种情况下,你基本上(再次,更细粒度)这样做:

synchronized(MyObject.class) {

}

也就是说,无论你是否有相同的对象或不同的对象进行访问,你都会锁定所有访问。

这取决于您要完成的任务,以及您要锁定的内容以及这些锁的使用方式。如果要保护每个实例的状态,则可能需要每个实例(非静态)锁定对象。如果您要保护全局状态,则需要一个在每个人之间共享的静态锁定对象。

答案 1 :(得分:1)

一如既往地取决于具体情况。你想做什么?如果锁应该全局共享,那么它应该是静态的。如果您尝试同步的内容是非静态的,那么您可能不应该使用静态锁定对象,因为这样会阻止对单独实体的同时访问。

答案 2 :(得分:1)

最大的区别在于锁定非静态对象意味着您可能锁定两个不同的对象,因此不会提供任何互斥。如果只需要在对象级别提供互斥,那么也许这就是你想要的。 (实际上,当您同步(非静态)方法时会发生这种情况:您正在同步this,这绝对不是静态对象。)