繁体   English   中英

当使用synced(lock)时,锁定对象是静态的还是非静态的?

[英]When using synchronized(lock), the lock object is prefered to be static or non-static?

当使用这样的东西:

private final Object lock = new Object()

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

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

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

synchronized(this) {

}

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

因此,这取决于您在做什么。 在前一种情况下,麻烦分配一个锁对象是没有意义的,除非您拥有多个这些锁来保护较小的数据子集。 在后一种情况下,您基本上(再次是更细粒度的)这样做:

synchronized(MyObject.class) {

}

也就是说,无论您具有相同的对象还是进行访问的对象不同,您都将禁止所有访问。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM