Java线程面试及答案--面试必看

本文涵盖线程生命周期、Socket通信、线程优先级、线程局部变量等核心概念,解析HashMap线程安全问题,深入探讨Java多线程实现与线程安全集合,帮助你全面掌握Java线程知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是博主精心准备的各厂线程面试都可能涉及的问题及答案,接下来让我们一起看看都是些什么问题吧。

1.简述线程的生命周期

线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
生命周期的五种状态
新建(new Thread)

当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)
例如:Thread t1=new Thread();
就绪(runnable)
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

2. Socket通信

(tcp/udp区别及JAVA的实现方式)
TCP——传输控制协议,具有极高的可靠性,保
证数据包按照顺序准确到达,但其也有着很高的额外负担。
UDP——使用者数据元协议,并不能保证
数据包会被成功的送达,也不保证数据包到达的顺序,但其传输速度很快。大多数我们会使用TCP,
偶尔才会动用UDP。

3. Java线程的优先级设置遵循什么原则?

Java线程的优先级设置遵从下述原则:
(1) 线程创建时,子线程继承父线程的优先级
(2) 线程创建后,可在程序中通过调用setPriority( )方法改变线程的优先级
(3) 线程的优先级是1~10之间的正整数,数字越大优先级越高,默认的优先级是居中,即为5。

4. 什么是线程局部变量?

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

5.什么是线程安全?

如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果,那么你的代码就是线程安全的。

这个问题有值得一提的地方,就是线程安全也是有几个级别的:
1)不可变
像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用
2)绝对线程安全
不管运行时环境如何,调用者都不需要额外的同步措施。要做到这一点通常需要付出许多额外的代价,Java中标注自己是线程安全的类,实际上绝大多数都不是线程安全的,不过绝对线程安全的类,Java中也有,比方说CopyOnWriteArrayList、CopyOnWriteArraySet
3)相对线程安全
相对线程安全也就是我们通常意义上所说的线程安全,像Vector这种,add、remove方法都是原子操作,不会被打断,但也仅限于此,如果有个线程在遍历某个Vector、有个线程同时在add这个Vector,99%的情况下都会出现ConcurrentModificationException,也就是fail-fast机制。
4)线程非安全
这个就没什么好说的了,ArrayList、LinkedList、HashMap等都是线程非安全的类。

6.HashMap 是线程安全的吗?为什么不是线程安全的?

不是线程安全的。
不安全的原因. resize死循环

7.Java中用到的线程调度算法是什么?

抢占式。
一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。

8.在Java中怎么实现多线程?描述线程状态的变化过程

当多个线程访问同一个数据时,容易出现线程安全问题,需要某种方式来确保资源在某一时刻只被一个线程使用。需要让线程同步,保证数据安全线程同步的实现方案: 同步代码块和同步方法,均需要使用synchronized关键字

同步代码块:public void makeWithdrawal(int amt) {
synchronized (acct) {	}
}

同步方法:public synchronized void makeWithdrawal(int amt) { }
线程同步的好处:解决了线程安全问题
线程同步的缺点:性能下降,可能会带来死锁

9.线程安全与非线程安全集合说一下,底层怎么实现的(hashmap,concurrenthashmap)

10. HashMap 的扩容过程

11. HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的

12. Java中如何获取到线程dump文件

13. 单例模式的线程安全性

14. 在多线程编程里,wait方法的调用方式是怎样的?

15. volatile关键字是否能保证线程安全?

16. 常用的Java多线程启动方式,Executors线程池有几种常用类型?

17. 创建n多个线程,如何保证这些线程同时启动?看清,是“同时”

18. 18. 编写java多线程程序有几种实现方式?

19. 19. Java创建线程后,调用start()方法和run()的区别

20. Java中实现线程通信的三个方法的作用是什么?

21. 进程和线程的区别

由于文章篇幅原因,其他问题小伙伴们可以去百度搜索,度娘哪里都有

喜欢的朋友可以给博主点点赞和关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值