Java多线程面试系列——为什么需要多线程
💡
原文中文,约5000字,阅读约需12分钟。
📝
内容提要
本文介绍了Android开发中关于Java多线程的问题,包括多线程的意图、问题原因和处理方式。讨论了进程和线程的差异,以及为什么需要多线程。还提到了多线程编程中的可见性、原子性和有序性问题,以及如何处理这些问题。最后,介绍了Java内存模型(JMM)和处理可见性、原子性和有序性问题的方法。
🎯
关键要点
- Java多线程在Android开发面试中是重要话题,涉及多线程的意图、问题及处理方式。
- 多线程的需求源于CPU、内存和IO设备之间的速度差异,采用多进程和多线程机制提高CPU利用率。
- 进程是正在运行的应用程序,线程是应用程序中的执行路径,线程切换比进程更轻量,且线程可以共享资源。
- 即使在单核CPU上,多线程仍然可以提高IO操作的效率。
- 多线程编程中常见问题包括可见性、原子性和有序性,缺一不可会导致程序错误。
- 可见性问题源于多核CPU的缓存机制,不同线程可能无法看到同一变量的最新值。
- 原子性问题主要由于大部分操作不是原子性的,以及线程切换导致的中断。
- 有序性问题可能由于指令重排序,影响多线程的执行顺序。
- Java内存模型(JMM)通过定义标准来处理可见性、原子性和有序性的问题。
- JMM确保Java程序在不同平台下的一致性,并定义了volatile、synchronized和final等关键字。
- 八项happens-before原则确保操作的顺序性和可见性。
- volatile关键字确保变量的可见性和防止指令重排序。
- synchronized关键字确保代码块的原子性和可见性,但会导致线程阻塞。
- 局部变量是线程安全的,因为每个线程都有独立的调用栈。
➡️