永发信息网

求高手指教:synchronized(Foo.class)和synchronized(getClass())

答案:3  悬赏:10  手机版
解决时间 2021-01-24 17:19
  • 提问者网友:暮烟疏雨之际
  • 2021-01-24 10:51
最近在网上看到一个流行甚广的说法:
“记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不相同,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。 ”
但是我刚刚找到《Effective Java》第二版翻了一下,并没有找到这一说法。
请高手指教这一说法到底是不是子乌虚有?
synchronized(getClass())到底能否使用?
谢谢!
最佳答案
  • 五星知识达人网友:轮獄道
  • 2021-01-24 11:21
我对此问题也有疑惑,使用JDK1.6发现下述情况:
1. 查看了JDK关于getClass的说明如下:


  Class<?
extends TSABC>
java.lang.Object.getClass()


  Returns the runtime class of this Object. The returned
Class object is the object that is locked by static
synchronized methods of the represented class.
  The actual result type is Class<? extends |X|> where
|X| is the erasure of the static type of the expression on which
getClass is called. For example, no cast is required in this
code fragment:


  Number n = 0;
Class<? extends Number> c =
n.getClass();


  Returns:
  The Class object that represents the runtime class of this
object.
  See Also:
  The Java * Language
Specification, Third Edition (15.8.2 Class * Literals)
  
  从上面的说明来看:这个 getClass()返回的是静态类锁.


    2. 我也自行写了一个程序进行验证。发现对某对象A,使用A.class和a.getClass()(a为A的实例)是互斥的。
全部回答
  • 1楼网友:爱难随人意
  • 2021-01-24 12:59
没有上下文的话,可能不太好理解“记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不相同,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。”这句话。 要想弄明白Foo.class和P1.getClass() 获得的锁是不是同一个,得先弄明白Foo.class和P1.getClass()获得的对象是不是同一个。 若P1是Foo类的引用,且指向的是Foo类的对象。那么Foo.class和P1.getClass() 获得的锁是Foo的Class对象的锁。 若P1是Foo类的引用,但指向的是Foo类的子类对象。那么Foo.class获得的锁是Foo的Class对象的锁,P1.getClass() 获得的锁是子类的Class对象的锁。 类.class返回类的Class的对象。 类.getClass()返回引用运行时真正所指的对象(因为:子对象的引用可能会赋给父对象的引用变量中)所属的类的Class的对象。
  • 2楼网友:冷風如刀
  • 2021-01-24 12:09
搜一下:求高手指教:synchronized(Foo.class)和synchronized(getClass())
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯