继续进行基础知识整理。
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();
}
}