一、notify() 和 notifyAll() 有什么区别?面试
先解释两个概念:多线程
等待池:假设一个线程调用了wait方法,线程就会释放该对象的锁,进入到该对象的等待池.net
锁池:只有得到了对象的锁,线程才会执行对象的synchronizeed代码,对象的锁每次只有一个线程能够得到,其它线程只能在锁池中等待线程
notify()方法随机唤醒对象等待池中的一个线程,进入锁池。对象
notifyAll()唤醒对象的等待池中的全部线程,进入锁池。blog
二、execute()和submit()有什么区别?接口
线程任务分两类,一类是实现了runnable接口,一类是实现了callable接口。队列
execute(Runnable x)没有返回值,能够执行任务,但没法判断任务是否成功完成,实现runnable接口资源
submit(Runnable x)返回一个future。能够用这个future来判断任务是否成功完成,实现Callable接口get
三、sleep() 和 wait() 有什么区别?
①sleep()是thread类的静态本地方法
wait()是Obejct类的成员本地方法
②sleep()方法能够在任何地方使用
wait()方法只能在同步方法或同步代码块中使用
③sleep()会休眠当前线程指定时间,释放CPU资源,不释放对象锁,休眠时间到自动苏醒继续执行
wait()方法放弃持有的对象锁,进入等待队列,当该对象被调动notify()或notifyAll()方法后才有机会竞争获取对象锁,进行运行状态
④均需捕获interruptedException异常
四、synchronized 和 volatile 的区别是什么?
做用:
synchronized表示只有一个线程能够获取做用对象的锁,执行代码,阻塞其它线程。
volatile表示变量在CPU寄存器中是不肯定的,必须从主存中读取,保证多线程环境下变量的可见性和有序性。
区别:
synchronized能够做用于方法、变量;volatile只能做用于变量。
synchronized能够保证线程间的有序性、原子性和可见性;volatile纸包装了可见性和有序性,没法保证原子性。
synchronized线程阻塞,volatile线程不阻塞。