为什么我们使用Object作为同步锁?

时间:2012-01-07 23:40:58

标签: java

它是否比使用String等锁定提供任何好处?

private Object lock = new Object();

private String lock = new String();

5 个答案:

答案 0 :(得分:6)

任何课程都可以。使用Object是有意义的,因为它是您可以创建的最小和最简单的对象。其他任何事情都会“太多”。

答案 1 :(得分:3)

就像其他人所说的那样,对你的锁使用String或Object之间真的没什么区别,尽管有些人会说一个人比另一个更“浪费”内存。如果您正在寻找一些良好的同步“原语”,那么值得看一下Java Concurrency packages,实际上是一个Lock对象,它有很多有用的方法可以利用。

答案 2 :(得分:3)

通常,您不希望将String对象用作同步锁。原因是JVM可以通过实习来优化用于存储字符串的内存,因为字符串是不可变的。这可能会导致系统中不相关的部分“共享”从未打算共享的锁。这可以表现为简单的非最佳性能,或者在最坏的情况下,来自竞争条件的死锁,在没有调试器的情况下是非显而易见的。

这也适用于优化的其他Object原语等效项,如Integer,Long和Boolean。您不希望将它们用作锁,例如,所有值为true的布尔对象实际上都可以引用同一个Boolean.TRUE实例。

此问题将在下面的链接中进一步解释。

LCK01-J. Do not synchronize on objects that may be reused

答案 3 :(得分:1)

不,不。只是你明确地说它只是一个没有其他意义的对象而不是用于锁定 - 而String是一个字符串,而一个空字符串仍然是一个有意义的实体。

答案 4 :(得分:1)

没有

任何对象都同样适用。