Java基础知识整理(二)

时间:2021-04-03 19:42:19

继续进行基础知识整理。

8 GC是什么,为什么要有GC。

GC是Gabage Collection的简称。在Java中,没有提供释放已分配资源的方法,由JVM自动检测对象是否超过作用域,从而达到回收内存的机制。


9 多线程有几种实现方法?同步有几种实现方法?

多线程有两种实现方法,分别是继承Thread类和实现Runnable接口。

1> 继承Thread类

public class MyThread extends Thread{

@overide

public void run(){

System.out.println("execute func");

}

public static void main(String[] args){

MyThread thread1 = new MyThread();

MyThread thread2 = new MyThread();

thread1.start();

thread2.start();

}

}


2> 当MyThread类已经继承了其他类时,由于Java语言的限定,我们不能多继承,要实现多线程就可以通过实现Runnable接口的方式。

public class MyThread extends OtherClass implements Runnable{

public void run(){

System.out.println("execute func");

}

public static void main(String[] args){

MyThread thread1 = new MyThread();

Thread thread = new Thread(thread1);

thread.start();

}

}

请注意调用MyThead的方式,与继承Thread的方式是不同的。


Java中的线程有4中状态,分别是运行、就绪、挂起和结束。

同步的实现方法有两种,分别是synchronized, java.util.concurrent.locks.lock。lock的锁定是通过代码实现的,而synchronized是通过jvm实现的。synchronized在锁定时,如果发生异常,jvm会自动将锁释放掉,不会因为异常没有释放锁导致线程死锁。而lock在出现异常时,必须在finally中将锁释放掉,否则会死锁。lock的性能比synchronized好。


10 垃圾回收的基本原理是什么?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆中的所有对象,通过这种方式确定有哪些对象是可达的,哪些对象是不可达的。当GC确定一些对象不可达时,GC就会收回这些内存空间。

程序员也可以手动执行System.gc()通知GC运行。但是java的语言规范并不保证GC一定会执行。


11 Java匿名内部类

匿名内部类就是没有名字的内部类。因为没有名字,所以只可以使用一次,目的是为了减少代码的编写。匿名内部内必须继承一个抽象类或者实现一个接口。

不是用匿名内部类的实现:

abstract  class  Person {
     public  abstract  void  eat();
}
 
class  Child  extends  Person {
     public  void  eat() {
         System.out.println( "eat something" );
     }
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p =  new  Child();
         p.eat();
     }
}

事实上Child只使用了一次,我们完全可以把它搞成一个匿名内部类:

abstract  class  Person {
     public  abstract  void  eat();
}
 
public  class  Demo {
     public  static  void  main(String[] args) {
         Person p =  new  Person() {
             public  void  eat() {
                 System.out.println( "eat something" );
             }
         };
         p.eat();
     }
}
二者功能相同。