1、有关HashMap与Hashtable的区别:
HashMap:线程不安全,效率高,允许null键和null值
Hashtable:线程安全,效率低,不允许null键和null值,报错Java.lang.NullPointerException空指针异常
2、List、Set、Map等接口是否都继承自Map接口?
List、Set不是继承自Map接口,他们继承自Collection接口
Map接口本身就是一个底层接口
3、Collection和Collections的区别?
Collection是接口,单列集合的顶层接口,有子接口List和Set
Collections是类,针对集合操作的工具类,有对集合进行排序和二分查找的方法
4、final、finally、finalize的区别:
final:最终的意思,可以修饰类、成员变量、成员方法
修饰类,类不能被继承
修饰变量,变量是常量
修饰方法,方法不能被重写
finally:异常处理类,是异常处理的一部分,用于释放资源。一般来说,代码肯定会执行,特殊情况:在执行到finally之前jvm退出了
finalize:不是关键字,finalize()方法,是Object类的一个方法,用于垃圾回收(很少见)
5、如果catch里面有return语句,请问finally里面的代码还会执行么?如果会,请问是在return前还是return后?
会执行。在return前执行。
准确的说应该是在中间执行
6、run()和start()的区别
run()仅仅是封装被线程执行的代码,直接调用是普通方法的调用
start()首先启动了线程,然后再由jvm自动调用该线程的run()方法
7、线程的生命周期(建议画图解释)
新建:创建线程对象new 对象
就绪:调用start()方法,线程有执行资格,没有执行权
运行:当获取到了CPU的执行权,线程有执行资格,有执行权(被别人抢到了CPU的执行权,返回就绪态)
死亡:run()结束,线程对象变成垃圾,等待被回收
阻塞:sleep()、wait(),由于一些操作使线程处于了该状态,没有执行资格,没有执行权;而另一些操作(sleep()时间到了、notify():唤醒,跟wait相对)却可以把他激活,激活后处于就绪状态
8、关于同步中的锁对象问题:
(1)同步代码块的锁对象是任意对象
(2)同步方法中的锁对象是this
(3)静态方法中的锁对象是类的自解码文件x.class
9、线程安全的类
(1)StringBuffer
(2)Vector线程安全时考虑同步的某集合
(3)Hashtable
10、同步的弊端
(1)效率低
(2)同步嵌套时容易产生死锁
11、死锁问题的代码
(1)创建一个锁:
public class MyLock {
//创建两把锁对象
static final Object obj1 = new Object();
static final Object obj2 = new Object();
}
(2)创建一个线程类
public class DieLockDemo extends Thread{
private boolean flag;
public DieLockDemo(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag) {
synchronized (MyLock.obj1) {
System.out.println("if obj1");
synchronized (MyLock.obj2) {
System.out.println("if obj2");
}
}
}else {
synchronized (MyLock.obj2) {
System.out.println("else obj1");
synchronized (MyLock.obj1) {
System.out.println("else obj2");
}
}
}
}
}
(3)死锁产生
public class DieLock {
public static void main(String[] args) {
DieLockDemo dl1 = new DieLockDemo(true);
DieLockDemo dl2 = new DieLockDemo(false);
dl1.start();
dl2.start();
}
}
12、多线程的实现方式
(1)继承Thread类
(2)实现Runnable接口
扩展:实现Callable接口,和线程池结合使用
13、同步有几种方式,分别是哪几种
(1)同步代码块
(2)同步方法
14、sleep()和wait()的区别
(1)sleep():必须指定时间,不是释放锁
(2)wait():可以指定时间,也可以不指定时间,释放锁
15、为什么wait()、notify()、notifyAll()定义在Object类中
因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁
而Object代表任意的对象,所以,定义在这里面
网友评论