Java并发面试整理
1、并行和并发有什么区别
并行:多个处理器或多核处理器同时处理多任务
并发:多个任务在同一个CPU核上,按细分的时间片轮流交替执行,从逻辑上看那些任务是同时执行的
2、进程和线程的区别
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下可以有多个线程来增加程序的执行速度。
3、守护线程是什么?
守护线程时运行在后台的一种特殊进程。它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。在Java中垃圾回收线程就是特殊的守护线程
4、多线程有几种实现方式
继承Thread类
实现Runnable接口
实现
Callable
接口通过FutureTask
包装器来创建Thread
通过线程池创建线程,使用线程池接口ExecutorService结合Callable,Future实现有返回结果的多线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EyP8eiui-1581784480363)(images/10.png)]
5、说一下Runnable和Callable有什么区别?
Runnable
没有返回值,Callable
可以拿到返回值;Callable
可以看做是Runnable
的补充
6、线程有哪些状态
创建
:新创建了一个线程对象,但还没有调用start()
方法
运行(Runnable)
:Java将线程中就绪(Ready)和运行中(running)两种状态笼统的称为"运行."线程对象创建后,其他线程(比如main线程)调用了对象的start()
方法,该状态的线程位于线程池中,等待被线程调度选中,获取CPU使用权,此时处于就绪状态(ready
).。就绪状态的线程在获得CPU时间片后
变为运行中状态
阻塞(Blocked):
表示线程阻塞于锁
等待(WAITING)
:表示该状态的线程需要等待其他线程做出一些特定动作(通知或中断)
超时等待(TIMED_WAITING):
该状态不同于WAITING,它可以在指定的时间自行返回。
终止(TERMINATED):
表示线程已经执行完毕
7、Sleep和Wait的区别
类的不同:
Sleep()
来自Thread
,wait()
来自Object
释放锁:
sleep()不会释放锁(抱着锁睡觉);wait
释放锁
用法不同:
sleep()
时间到会自动恢复;wait()
可以使用notify()/notifyAll()
直接唤醒
8、notify()和notifyAll()有什么区别
notify
将线程由等待池移动锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池
等待锁被释放后再次参与竞争。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n7DgWAWp-1581784480365)(images/11.png)]
9、线程的run()和start()有什么区别?
start()
方法用于启动线程;run
方法用于执行线程的运行时代码。
run()
可以重复调用,而start()
只能调用一次。
10、创建线程池有几种方式
11、线程池都有哪些状态?
Running
:这是最正常的状态,接受新的任务,处理等待队列中的任务
SHUTDOWN:
不接受新的任务提交,但是会继续处理等待队列中的任务
STOP:
不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程
TIDYING:
所有的任务都销毁了,workCount
为0,线程池的状态在转换为TIDYING
状态时,会执行钩子方法terminated()
TERMINATED:
terminated()
方法结束后,线程池的状态就会变成这个
12、线程池中的submit和execute()方法有什么区别?
13、在Java程序中怎么保证多线程的运行安全?
方法1:
使用安全类:比如
java.util.concurrent下的类
方法2:
使用自动锁synchronized
方法3:
使用手动锁
14、多线程中synchronized锁升级的原理是什么
15、什么是死锁
当线程A持有独占锁a,并尝试获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生阻塞现象,我们称为死锁。
16、怎么防止死锁
- 尽量使用
tryLock(Long timeout,TimeUnit unit)的方法,设置超时时间,超时可以退出防止死锁
- 尽量使用
Java.util.concurrent
并发类代替自己手写锁。- 尽量降低锁的使用粒度,尽量不要几个功能用同一把锁
- 尽量减少同步的代码块
17、ThreadLocal是什么?有哪些使用场景?
18、说一下synchronized底层实现原理?
19、Synchronized和voliate的区别是什么?
- voliate是变量修饰符,
synchronized
是修饰类、方法、代码块voliate
仅能实现变量的修改可见性,不能保证原子性;而synchronized
则可以保证变量的修改可见性和原子性voliate
不会造成线程的阻塞;synchronized
可能会造成线程的阻塞