Java线程面试必知:stop/suspend的弃用,wait/sleep区别,锁机制解析

需积分: 9 10 下载量 83 浏览量 更新于2024-09-11 收藏 13KB TXT 举报
"线程方面的面试题" 在Java编程中,线程是多任务处理的基础,它使得程序可以在同一时间执行多个不同的任务。面试中,线程相关的问题常常被用来评估候选人的并发编程能力。以下是一些常见的线程面试题及其详细解释: 1. **为何不推荐使用`stop()`、`suspend()`和`resume()`方法?** 这些方法在早期的Java版本中被定义,但后来由于它们可能导致线程安全问题而被标记为过时。`stop()`方法会立即停止线程,可能会导致数据不一致。`suspend()`和`resume()`配合使用时,如果调用`resume()`前`suspend()`未执行,那么线程将陷入等待状态,可能造成死锁。 2. **`sleep()`与`wait()`的区别是什么?** `sleep()`使当前线程暂停指定的时间,不会释放任何锁。而`wait()`让线程进入等待状态,直到收到通知或被中断,它会释放所持有的对象锁。`wait()`需要在同步块或方法中使用,因为它涉及到对象的监视器。 3. **如何创建线程:实现`Thread`类还是实现`Runnable`接口?** 两者都可以,但推荐实现`Runnable`接口,因为它可以避免单继承的限制,允许类同时继承另一个类。 4. **为什么不能直接调用`run()`来启动线程?** 直接调用`run()`方法只会将它作为普通方法执行,不会创建新的执行上下文,因此不会并发执行。要启动新线程,必须调用`start()`方法。 5. **一个线程是否可以同步同一个类的两个静态方法?** 是的,因为静态方法是与类关联的,而不是实例,所以多个线程可以同步类的不同静态方法,但同一时刻只有一个线程可以执行同一静态方法。 6. **解释`wait()`, `sleep()`, `notify()`和`notifyAll()`** - `wait()`使当前线程等待,直到其他线程调用该对象的`notify()`或`notifyAll()`。 - `sleep()`使当前线程暂停一段时间。 - `notify()`唤醒等待该对象的单个线程。 - `notifyAll()`唤醒所有等待该对象的线程。 7. **什么是死锁?如何避免?** 死锁是两个或多个线程互相等待对方释放资源,导致它们都无法继续执行的状态。预防死锁的方法包括:避免嵌套锁、设置锁顺序、超时机制和死锁检测算法。 8. **`synchronized`与`java.util.concurrent.locks.Lock`有何异同?** `synchronized`是内置关键字,自动管理锁的获取和释放;而`Lock`是显式锁,需要程序员手动管理,提供了更细粒度的控制。`Lock`提供了一些`synchronized`不具备的功能,如可中断的等待和尝试获取锁。 9. **在JSP中,`forward()`和`redirect()`有什么区别?** `forward()`内部跳转,不会改变URL,共享同一个请求范围内的对象(如session)。`redirect()`外部重定向,浏览器会发起新的HTTP请求,URL会改变,不共享请求范围的对象。 理解并熟练掌握这些线程概念和技巧对于在Java开发中编写高效、安全的并发代码至关重要。在面试中,能够清晰地解释这些概念并给出实际应用示例将有助于展示你的专业技能。