知识点

来源:互联网 发布:淘宝聚星台入口在哪里 编辑:程序博客网 时间:2024/05/29 13:22

1.常量池中主要存储2大类常量:字面量和符号引用。字面量如文本字符串,java中声明为final的常量值等等,而符号引用如类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。

2.类运行过程

首先编译生成.class文件,即二进制码,然后通过类加载classLoad机制加载到JVM内存中;主类(即有public那个类)加载到方法区(有常量池、main字节码)中,找到(public static void main(String[] rgs))入口,运行main函数,如果在main函数中检测到对象,即栈中指向堆地址引用对象,就在堆中创建该对象,首先,在方法区加载该类,该类型信息包含方法表等,其次在堆中new一个该对象,该对象中有指向它的方法的指针,可以在方法表中查找所要调用的方法(在main方法中调用对象的方法)。

3.Class对象在堆中生成,作为方法区数据的访问入口。

4.notify只能唤醒一个线程,如果本方唤醒了本方,没有意义。而notifyAll解决了本方线程一定会唤醒对方线程的问题。

5.jvm中每个对象都有一个monitor,当synchronized发生的时候,jvm是用monitorenter和monitorexit两个指令来控制锁的获取和释放。假如一个类中定义了一个synchronized的static函数A,也定义了一个synchronized的instance函数B,那么这个类的同一对象Obj在多线程中分别访问A和B两个方法时,不会构成同步,因为他们的锁都不相同。A方法的锁是Obj所属的那个Class,而B的锁是Obj所属的这个对象。在<effective java>一书中将Foo.class和P1.getClass()用于作同步锁还不相同,不能用P1.getClass()来达到锁这个Class的目的。P1指的是由Foo类产生的对象。

0 0
原创粉丝点击