Java面试深度解析:多线程与锁机制

需积分: 5 0 下载量 200 浏览量 更新于2024-06-26 1 收藏 134KB DOCX 举报
“Java面试第二部分:多线程与锁,涵盖了锁升级、虚拟机锁优化、锁的实现原理、线程安全、可重入锁、线程池的实现等内容,旨在帮助求职者准备Java面试。” 在Java编程中,多线程和锁机制是核心概念,对于系统性能优化和并发控制起着至关重要的作用。以下是对这些知识点的详细说明: 1. **并行与并发**: - 并行是指多个任务在同一时刻在多个处理器或多核处理器上同时执行,实现真正的同步执行。 - 并发则是指在一个单核CPU中,通过时间片轮转的方式让多个任务看似同时运行,实际上它们是交替执行的。 2. **线程与进程**: - 进程是操作系统分配资源的基本单位,拥有独立的内存空间。 - 线程是执行单元,属于一个进程,共享进程的内存空间。多个线程可以在同一进程中执行,提高程序执行效率。 3. **守护线程(Daemon Thread)**: - 守护线程是一种后台线程,不阻止进程的退出。例如,Java的垃圾收集器就是守护线程,当所有非守护线程结束时,程序会终止,即使守护线程仍在运行。 4. **创建线程的三种方式**: - 继承`Thread`类并重写`run()`方法。 - 实现`Runnable`接口,并将其实例传递给`Thread`的构造函数。 - 实现`Callable`接口,该接口允许返回一个结果,并且可以抛出异常。 5. **`Runnable`与`Callable`的区别**: - `Runnable`没有返回值,适合只需要执行但不需要返回结果的情况。 - `Callable`可以返回一个结果,更适合需要计算结果的场景。 6. **线程状态**: - NEW:线程刚刚创建,尚未启动。 - RUNNABLE:线程正在执行。 - BLOCKED:线程被阻塞,等待获取锁。 - WAITING:线程进入无限等待状态,如`wait()`。 - TIMED_WAITING:线程进入定时等待状态,如`sleep()`或`await()`。 - TERMINATED:线程执行完成。 7. **`sleep()`与`wait()`的区别**: - `sleep()`是`Thread`类的方法,不释放对象锁,用于暂停当前线程的执行一段时间。 - `wait()`是`Object`类的方法,释放对象锁,使线程进入等待状态,直到收到`notify()`或`notifyAll()`。 8. **`notify()`与`notifyAll()`的区别**: - `notify()`仅唤醒一个等待在该对象监视器上的线程,由JVM决定唤醒哪个线程。 - `notifyAll()`唤醒所有等待在该对象监视器上的线程,它们都会尝试获取锁。 9. **`run()`与`start()`**: - `start()`启动线程,使得线程开始执行`run()`方法中的代码,是多线程执行的入口。 - `run()`直接调用执行,不会开启新的线程,如果直接调用,线程仍然是在单线程环境下执行。 了解这些基础知识对于理解Java多线程编程至关重要,特别是在面试场景中,这些都是经常会被问到的问题。深入理解这些概念和机制可以帮助开发者设计出高效、稳定的并发应用程序。