600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Java面试——多线程高并发

Java面试——多线程高并发

时间:2022-11-13 17:53:34

相关推荐

Java面试——多线程高并发

1、什么是线程?线程和进程有什么区别?

答:线程是程序执行的最小执行单位,进程是资源分配的最小单位;一个进程就是一个应用程序,系统会为该进程分配资源空间,当多用户并发请求的时候,为每个用户创建一个进程资源开销太大难以实现,就开辟了线程,线程速度比较快,线程之间共享进程之间的内存资源。

1.1、多线程和高并发是两个概念。

我们做过的泰康积分商城,由于用户数量不多,所以并没有使用多线程技术,但也会有并发问题需要考虑,比如减库存这个业务;对于这种没有用多线程技术的项目,解决并发问题的主要方法就是用锁,实际上就是使关键节点串行化执行。

而多线程,要解决的其实是两个痛点,一是避免开辟进程过多造成的资源浪费(严重的情况会使系统宕机);二是解决并发问题。这两层都要看到,不要混淆。

2、如何在Java中实现线程?

有四种实现方法:

1)继承Thread类,重写run()方法;

2)实现Runnable接口,重写run()方法;

3)实现Callable接口,重写call()方法;可以有返回值,通过Callable<>接口的泛型指定返回值的类型。

4)使用ExecutorService、Callable、Future实现有返回结果的多线程。

3、Java 关键字volatile 与 synchronized 作用与区别?

答:线程有几个特性

原子性(Atomic):不被其他线程中断

可见性(Visibility):执行结果其他线程可以看到

顺序性(Ordering):保证线程操作的执行顺序

volatile 只能用来修饰变量、作用范围较小; synchronized可以修饰变量、方法、类和代码块。

volatile 修饰的变量在线程未结束的时候就可以被其他线程读取,不能保证原子性;

synchronized则保证线程执行完成后变量结果值才可见,保证了原子性、可见性和顺序性。

4、线程有哪些不同的线程生命周期?

create 新建状态

runnable 就绪状态/可运行状态

running 运行状态

blocked 阻塞状态

dead 终止状态

5、什么是死锁(Deadlock)?如何分析和避免死锁?

死锁是指多个线程因竞争资源而造成的一种相互等待的僵局,若无外力作用,这些线程任务都将无法向前推进。

避免死锁就要避免循环等待条件的产生、设置资源标识位以及执行顺序等。

6、什么是线程安全?Vector是一个线程安全类吗?

线程安全就是,多线程操作和多个线程单独、依次操作产生得结果相同。

一般认为Vector是一个线程安全的类,但实际上虽然Vector类中好多方法是用Synchronized修饰的,但是也有remove 和 contains等几个方法不是用Synchronized修饰的,这就需要在业务代码块中添加同步锁来保证线程安全了,所以严格来说不能直接说Vector是线程安全类。

7、Java中如何停止一个线程?

Thread类中的interrupt()方法可以中断线程,注意调用interrupt()方法仅仅是在当前线程打一个中断标志,并不是真正的停止线程;具体中断线程操作为:在测试、业务方法中用start()实例方法启动线程,在合适的节点用interrupt()方法给线程打中断标志,在子线程中提前设置代码——通过判断中断标志来退出子线程调用,可以用break关键字或者returen()退出。

Thread.interrupted()静态方法可以判断当前线程的中断状态,也可以调用thread.isInterrupted()实例方法判断当前线程的中断状态。这两个方法的区别在于: 静态方法interrupted()判断完中断状态后会清除中断标志, 实例方法isInterrupted()判断完后不会清除中断标志。

8、sleep()、suspend()和wait()之间有什么区别?

注:以上三个方法都是使线程进入blocked状态的

答:三个方法使用后线程的唤醒方式不同,sleep()固定时间后主动唤醒,suspend()是已经废弃的暂停方法、被resumen唤醒,wait()被notify()或者或者 notifyAll()唤醒。

9、什么是线程饿死,什么是活锁?

饿死:线程没有被合理的分配资源,都处于无限期的等待;

活锁:所有线程都认为自己的优先级别不够高,都在等待对方先执行。

10、什么是Java Timer类?如何创建一个有特定时间间隔的任务?

答:Timer可以看成一个定时器,用来安排以后在线程中执行的任务,可设置任务执行一次,或者定期重复执行。Timer可以调度TimerTask创建有特定时间间隔的任务,TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力;一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。

11、什么是线程池? 为什么要使用它?

答:线程池用来管理多线程任务中的线程。一个线程需要创建,运行和销毁,如果客户端访问量过大,那么创建线程和销毁线程将是一笔很大、且有些浪费的开销;有了线程池,我们会在程序启动的时候事先放入几个线程,当有任务调用的时候就直接去取线程池中的线程,任务结束再将链接放回线程池而不是直接销毁。当然线程池本身也占用资源,所有容量也不易过多。

12、多线程中的忙循环是什么?

答: 忙循环就是程序员用循环让一个线程等待;不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,它就是在运行一个空循环。这么做的目的是为了保留CPU缓存。在多核系统中,一个等待线程醒来的时候可能就在另一个内核运行了,这样会重建缓存,为了避免重建缓存和减少等待重建的时间就可以使用忙循环。

13、Thread 类中的start() 和run() 方法有什么区别?

1)start 是用来启动线程的,run()则是运行线程的 ;

2)start 在一个线程中只能调用一次,而run则可以多次调用;

3)查看Thread类的源码会发现start 有synchronized修饰,可见这个方法是线程安全的。

14、在多线程中,什么是上下文切换?

即使是单核CPU也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现多线程。时间片就是CPU分配给各个线程的时间,因为时间片非常短(一般为几十毫秒),所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的。

CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换。

这就像我们同时读两本书,当我们在读一本英文的技术书籍时,发现某个单词不认识,于是便打开中英文词典,但是在放下英文书籍之前,大脑必须先记住这本书读到了多少页的第多少行,等查完单词之后,能够继续读这本书。这样的切换是会影响读书效率的,同样上下文切换也会影响多线程的执行速度。

15、(相对于线程来说)Java中堆和栈有什么不同?

答:创建的对象是在堆中,堆内存是各线程共享的区域;而栈中内存是线程私有的区域、生命周期随着线程的消亡而消亡。系统为了提高运行效率会从堆中复制一份变量到栈内存中,运行完成后再刷新到堆内存中。

16、Thread类中的yield方法有什么作用?

答:让当前正在运行的线程回到就绪状态,让出cpu,等待cpu的再次调度。

17、Java中notify 和 notifyAll有什么区别?

答:notify是唤醒等待池中的某一个线程但是不指定是那个,notifyAll是唤醒等待池中的所有线程进入锁池中竞争对象。

19、Java多线程中调用wait() 和 sleep()方法有什么不同?

答:sleep()是Thread的静态方法;线程调用此方法会让线程暂时放弃cpu资源,但是不会释放对象锁;时间到后会自动苏醒;需要捕获异常

wait()方法必须放在同步控制方法或者同步语句块中使用;会暂时放弃对象锁;需要notify()方法将其唤醒。

20、有三个线程T1,T2,T3,怎么确保它们按顺序执行?

启动某个线程的时候分别加入join()方法,例如T3调用T2、然后T2调用T1,利用单线程池法

21、什么是ThreadLocal?

ThreadLocal是局部本地变量,为单个线程私有变量、不能共享,所以不存在线程安全问题;

相对的还有共享变量,线程不安全,需要用锁机制来维护。

22、Java线程池中submit() 和 execute()方法有什么区别?

答:两个方法都可以向线程池中提交任务,区别是:

execute()是Executor中的方法,用void修饰,即没有返回值;

submit() 是ExecutorService中的方法,有返回值,返回值为Future对象,可以用get方法获取执行结果。

23、Java中Runnable和Callable有什么不同?

答:区别是:

1)Runnable从jdk1.0就有,Callable从jdk5.0有;

2)callabel的call()方法可返回Future对象,Runnable的run()方法没有返回值。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。