Java多线程21问:从基础到高级深入解析

版权申诉
0 下载量 170 浏览量 更新于2024-08-06 收藏 466KB PDF 举报
"这份资料包含了21个关于Java多线程的重要问题及其解答,涵盖了从基本概念到高级特性的各个方面,旨在帮助读者深入理解Java多线程编程。" 1. **并行与并发的区别** - 并行是指在多处理器或多核环境下,多个任务可以同时执行,每个任务都在独立的处理器上运行。 - 并发则是在单个CPU核心中,通过时间片轮转的方式使得多个任务看起来像是在同时运行,实际上它们是交替执行的。 2. **线程与进程的区别** - 进程是系统资源分配的基本单位,拥有独立的内存空间,而线程是CPU调度的基本单位,共享进程内的内存资源。 - 一个程序至少包含一个进程,一个进程中可以包含多个线程,多线程能提高程序的执行效率。 3. **守护线程** - 守护线程是一种特殊的线程,如Java中的垃圾收集器,它在所有非守护线程结束后自动结束,不会阻止JVM的退出。 4. **创建线程的三种方式** - 继承`Thread`类并重写`run`方法。 - 实现`Runnable`接口并提供`run`方法,然后通过`Thread`实例化并启动。 - 实现`Callable`接口,可以返回结果,通过`FutureTask`包装并用`ExecutorService`提交。 5. **runnable和callable的区别** - `Runnable`没有返回值,适合只进行操作不需返回结果的场景。 - `Callable`可以有返回值,可以抛出检查异常,更适用于需要返回计算结果的情况。 6. **sleep()与wait()的区别** - `sleep()`使当前线程休眠,不释放对象锁,醒来后继续执行。 - `wait()`使当前线程等待,释放对象锁,必须在同步块或方法中调用,由其他线程调用`notify()`或`notifyAll()`唤醒。 7. **notify()和notifyAll()的区别** - `notify()`随机唤醒一个等待该对象锁的线程。 - `notifyAll()`唤醒所有等待该对象锁的线程。 8. **run()与start()的区别** - `run()`直接执行线程的代码,不会实现多线程效果。 - `start()`启动线程,调用`run()`方法,实现线程并发执行。 9. **创建线程池的四种方式** - `Executors.newFixedThreadPool(int nThreads)`:固定大小线程池,适合执行大量重复短生命周期的任务。 - `Executors.newSingleThreadExecutor()`:单线程线程池,所有任务在线程串行执行。 - `Executors.newCachedThreadPool()`:缓存线程池,可自动调整线程数量,空闲60秒后会销毁线程。 - `Executors.newScheduledThreadPool(int corePoolSize)`:调度线程池,可定时或延迟执行任务。 10. **线程池的状态** - 线程池有多种状态,如RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED,用于控制线程池的工作流程。 11. **submit()与execute()的区别** - `submit()`除了执行任务外,还能返回`Future`对象,可以用来获取任务结果或判断任务是否完成。 - `execute()`仅用于执行任务,不返回结果。 12. **保证多线程运行安全的方法** - 使用`synchronized`关键字或Lock来控制并发访问。 - 使用`volatile`保证变量可见性和有序性。 - 使用`ThreadLocal`为每个线程提供独立的变量副本。 - 使用并发集合,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等。 13. **多线程锁升级原理** - Java内存模型中的锁升级过程,从无锁到偏向锁、轻量级锁、重量级锁,根据竞争程度动态优化锁的性能。 14. **死锁** - 死锁是两个或多个线程互相等待对方释放资源导致的僵局,无法继续执行。 15. **防止死锁的方法** - 避免循环等待资源。 - 设置超时或中断机制。 - 使用死锁检测和恢复策略。 16. **ThreadLocal** - ThreadLocal为每个线程都创建了单独的变量副本,避免了线程间的数据冲突,常用于线程局部变量的存储。 17. **synchronized底层实现原理** - synchronized基于JVM的锁机制,包括对象头标记、Monitor(管程)等,实现锁的获取与释放。 18. **synchronized与volatile的区别** - synchronized提供互斥锁,保证数据一致性;volatile保证变量的可见性,但不保证原子性。 19. **synchronized与Lock的区别** - synchronized是内置的语言特性,使用简单,但不够灵活;Lock是API,提供更多的控制和更高的性能。 - Lock需要手动获取和释放锁,synchronized自动释放。 20. **synchronized与ReentrantLock的区别** - ReentrantLock是可重入锁,与synchronized具有相同的基本行为,但提供了更细粒度的控制,如公平锁、尝试加锁、可中断锁等。 21. **atomic的原理** - 原子变量类如AtomicInteger使用CAS(Compare and Swap)操作,保证在多线程环境下的原子性操作,无锁且高性能。 这些知识点覆盖了Java多线程的基础到高级应用,对理解和实践Java多线程编程有着重要的指导意义。