原题如下:
Which three will compile and run without exception? (Choose three.)
A. private synchronized Object o;
B. void go() {
synchronized() { /* code here */ }
C. public synchronized void go() { /* code here */ }
D. private synchronized(this) void go() { /* code here */ }
E. void go() {
synchronized(Object.class) { /* code here */ }
F. void go() {
Object o = new Object();
synchronized(o) { /* code here */ }
E当中的synchronized(Object.class)还是头一次看到。这是什么语法呢?

解决方案 »

  1.   

    synchronized(Object.class)括号里面是一个对象,synchronized语句获得该对象的锁。
    Object.class也是个对象,是Object类的类对象。
      

  2.   

    同问同问,在Object中并没有找到该属性呢。
      

  3.   

    任何类都可以点出class属性的。
      

  4.   

    A中不允许使用synchronized修饰符来修饰属性。
    B中是非法的表达式。
    C是正确的。
    D中括号里不可以存在this关键字,里面可以是类,接口,和枚举。
    E是正确的。
    F也是正确的。
    而对于E中Object.class其实就是一个类。
      

  5.   

    这个代码有意思:
    class TestOC{
    public static void main(String[] args){
    System.out.println(Object.class);
    System.out.println(new Object());
    System.out.println(new TestOC());
    System.out.println(TestOC.class);
    }
    }
    输出如下:
    class java.lang.Object
    java.lang.Object@55a6c368
    TestOC@37670cc6
    class TestOC
      

  6.   

    Object.class 应该是个对象呀。
    三楼的朋友说了,任何类都可以点出class属性的。
    synchronized后面也应该跟个对象呀,而不是类。
      

  7.   

    synchronized只能跟具体的对象吧
      

  8.   

    虽然都能点出来,但是我确实在API文档中没有找到呢
      

  9.   

    我也觉得应该跟具体对象。在api还有Object源代码中都找不到这个语法。是不是这样:即便选项E的代码可以编译,在实际运用时可能还要根据具体的情况将Object.class替换成相应的实例对象,就像<? extends Object>一样。请高手继续。
      

  10.   

    在文档中看看Class类的说明:
    Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。 以下示例使用 Class 对象来显示对象的类名: 
         void printClassName(Object obj) {
             System.out.println("The class of " + obj +
                                " is " + obj.getClass().getName());
         }
     还可以使用一个类字面值(JLS Section 15.8.2)来获得命名类型(或 void)的 Class 对象。例如: 
         System.out.println("The name of class Foo is: "+Foo.class.getName());
     
      

  11.   

    这要看你用synchronized的目的了。
    synchronized语句主要是解决多线程情况下同步问题,那么就要看你想要让哪些东西同步,这直接关系到你选用的作为锁的对象。
    Object.class作为锁对象的好处是,在整个虚拟机范围内只有一个该对象,那么,凡是以之为锁的代码都同步!
      

  12.   

    没太注意 看楼上各位 牛人的回答 如有重复 算我抄袭好了Object.class 就和 Class 类中的 forName一样 (返回一个 Class 对象) (Object.class --> 想象成相对路径  想象字节码是什么结尾的 .class) Class也是一个具体的对象! Class 也是继承自 Object的! (java中一切皆对象 void 都是对象 当然int云云的 基本类型 我就不清楚了)```再来看synchronized(Object obj){} synchronized 获得Class对象的锁  很理所当然么 是吧!Class可以 利用反射类 调用任何方法 (包括私有方法哦!!) 
    有不懂的 可以继续提问滴 我很热心 呐 \(^o^)/~
      

  13.   

    再次翻阅参考资料,发现其实自己之前已经看到过这个知识点的,还做了记号。
    Object.class - 这里的Object可以是任意类,用于同步静态方法。把原文作了截图:
      

  14.   

    类在本质上也一种对象哦
    synchronized(Object.class)这样锁的就是类本身,可以用于修改类的静态属性