前言
多线程和高并发是毕业后求职大厂面试中必问的知识点,自己之前总是面试前才去找相关的知识点面试题来背背,隔段时间又忘了,没有沉淀下来,于是自己总结了下相关的知识点。
多线程
1. 进程和线程之间有什么不同?
进程是一个独立的运行环境,它可以被看作是一个程序或者一个应用。而线程是在进程中执行的一个任务。进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位。进程让操作系统的并发性成为可能,而线程让进程的内部并发成为可能。好比Java运行环境是一个(包含了不同的类和程序的)单一进程。
想理解的更深刻,请点击进程与线程的区别.
2. Thread 类中的start() 和run() 方法有什么区别?
1) start()被用来启动新的线程,run()不能。
2)start()不能被重复调用,run()可以。
3)start()中的run代码可以不执行完就继续执行下面的代码,即线程转换,如果直接调用run()必须等待其代码全部执行完才能继续执行下面的代码。
4)start()实现了多线程,run()没有实现多线程。
3. 在多线程中,什么是上下文切换?
上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。是多任务操作系统和多线程环境的基本特征。
4. Java中的volatile 变量是什么?
volatile是一个特殊的修饰符,只有成员变量(类的成员变量、类的静态成员变量)才能使用它。
被volatile修饰之后就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性(即一个线程修改了某个变量的值,这新值对其他线程来说是即刻可见的)。
2)禁止进行指令重排序。
5. Java中堆和栈有什么不同?(相对于线程来说)
栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,用于存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是