Java并发面试题, 线程的生命周期在 Java 中是如何定义的?
Java并发面试题, 线程的生命周期在 Java 中是如何定义的?
QA
Step 1
Q:: 面试题
A:: 线程的生命周期在 Java 中是如何定义的?
Step 1
Q:: 答案
A:: 线程在 Java 中有五个主要的生命周期阶段:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和终止(Terminated)。
1. 新建(New):线程对象被创建,但尚未调用 start()
方法。
2. 就绪(Runnable):调用了 start()
方法,线程被放入就绪队列,等待 CPU 调度。
3. 运行(Running):线程获得 CPU 时间片,开始执行 run()
方法中的代码。
4. 阻塞(Blocked):线程因等待某个条件(如 I/
O 操作、锁等)暂时停止运行,直到条件满足。
5. 终止(Terminated):线程的 run()
方法执行完毕或因异常退出,线程生命周期结束。
Step 2
Q:: 面试题
A:: 什么是线程安全,如何保证线程安全?
Step 2
Q:: 答案
A:: 线程安全是指多个线程访问共享资源时,不会引起数据不一致或程序错误。保证线程安全的方法包括:
1.
使用同步代码块(synchronized)或同步方法。
2.
使用显式锁(如 ReentrantLock)。
3.
使用线程安全的类(如 ConcurrentHashMap、CopyOnWriteArrayList 等)。
4.
避免共享可变状态,使用局部变量或不可变对象。
Step 3
Q:: 面试题
A:: Java 中的 volatile 关键字有什么作用?
Step 3
Q:: 答案
A:: volatile 关键字用于修饰变量,保证变量的可见性和有序性。
1.
可见性:当一个线程修改了 volatile 变量,其他线程可以立即看到修改后的值。
2.
有序性:禁止 JVM 对 volatile 变量进行指令重排序,保证操作的顺序性。
Step 4
Q:: 面试题
A:: 什么是线程池,为什么要使用线程池?
Step 4
Q:: 答案
A:: 线程池是一种管理线程的机制,能够重用线程,减少线程创建和销毁的开销,提高系统性能和稳定性。使用线程池的优点包括:
1.
降低资源消耗:重用线程,避免频繁创建和销毁线程。
2.
提高响应速度:当任务到达时,无需等待线程创建即可立即执行。
3.
提高线程管理的可控性:线程池可以统一管理线程的创建、销毁、数量控制等。
Step 5
Q:: 面试题
A:: 如何创建一个线程池?
Step 5
Q:: 答案
A:: 可以通过 Executors 工具类提供的方法创建线程池,如:
1. newFixedThreadPool(int nThreads)
:创建一个固定大小的线程池。
2. newCachedThreadPool()
:创建一个根据需要创建新线程的线程池。
3. newSingleThreadExecutor()
:创建一个只有一个线程的线程池。
4. newScheduledThreadPool(int corePoolSize)
:创建一个可以延迟或定时执行任务的线程池。
Step 6
Q:: 面试题
A:: Java 中的死锁是什么,如何避免死锁?
Step 6
Q:: 答案
A:: 死锁是指两个或多个线程互相等待对方释放资源,导致线程无法继续执行。避免死锁的方法包括:
1.
避免嵌套锁:尽量减少锁的嵌套层次,降低发生死锁的可能性。
2.
避免持有多个锁:尽量减少一个线程同时持有多个锁。
3.
使用超时锁:尝试获取锁时设置超时时间,超过时间则放弃获取锁。
4.
使用死锁检测算法:定期检测系统中是否存在死锁,并采取相应措施。