synchronized 和 volatile 的区别是什么?

一、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线程不阻塞。

 

天天一道面试题,持续更新@目录

相关文章
相关标签/搜索