面试中遇到的一些容易概念混淆,拿来比较的问题,总结下来和大家分享,我也是新手被虐很惨,有说的不对的还请大家见谅,各位加油!!!!
1:Runnable 与Thread区别
Runable 接口,避免单继承,可以实现资源共享
Thread类实现了runable接口,有start方法
2:Run与start区别
使用run不能达到多线程交互的效果,线程还是会顺序运行。
Start方法可以达到多线程抢占CPU的效果,因为不同操作系统CPU调度不同,所以start中使用 private native void start0() 调用系统底层去抢占CPU资源。
3:Wait 与Sleep区别
Wait 等待notify唤醒,释放资源锁
Sleep休眠 不释放资源锁
4:nofity与notifyall区别
notify从等待该对象的线程中唤醒一个线程
notigyall 从等待该对象的线程中唤醒全部线程,再让他们相互竞争锁,没得到锁的继续wait
5:Synchronized与 lock 区别
Synchronized jvm实现会释放资源,性能低。
lock 代码实现,自己finally释放资源,性能高。
1:上锁锁的永远是一个对象。
2:Synchronized 锁一个对象时其他的线程不能调用该线程Synchronized 修饰的方法,属性。可以调用非Synchronized 修饰的属性。
3:Synchronized 修饰属性对象
4:外部修饰方法,锁住的是调用此方法的实例,内部代码块Synchronized(this)
class A{
public Synchronized void func(){};
public void funcB(){Synchronized(this)}
}
A a = newA();
a.func();
给a上锁等价于a.funB();
5:修饰静态方法,锁类,不是实例
class A{
private Synchronized static Person p = new Person();
}
给A上锁 等价于Synchronized (A.class);