在Java世界里一切皆对象。Java有两种对象:Object实例对象和 Class对象。每个类运行时的类型信息用Class对象表示,它包含与类名 称、继承关系、字段、方法有关的信息。JVM将一个类加载入自己的方 法区内存时,会为其创建一个Class对象,对于一个类来说其Class对象 是唯一的。
Class类没有公共的构造方法,Class对象是在类加载的时候由Java虚 拟机调用类加载器中的defineClass方法自动构造的,因此不能显式地声 明一个Class对象。
所有的类都是在第一次使用时被动态加载到JVM中的(懒加载), 其各个类都是在必需时才加载的。这一点与许多传统语言(如C++)都 不同,JVM为动态加载机制配套了一个判定一个类是否已经被加载的检 查动作,使得类加载器首先检查这个类的Class对象是否已经被加载。如 果尚未加载,类加载器就会根据类的全限定名查找.class文件,验证后加 载到JVM的方法区内存,并构造其对应的Class对象。
普通的synchronized实例方法,其同步锁是当前对象this的监视锁。 如果某个synchronized方法是static(静态)方法,而不是普通的对象;
静态方法属于Class实例而不是单个Object实例,在静 态方法内部是不可以访问Object实例的this引用(也叫指针、句柄)的。
所以,修饰static方法的synchronized关键字就没有办法获得Object实例的 this对象的监视锁。
实际上,使用synchronized关键字修饰static方法时,synchronized的 同步锁并不是普通Object对象的监视锁,而是类所对应的Class对象的监 视锁。