并发问题是目前Java面试问的较多的问题,并且在目前高并发系统中也有很多场景可以用到这些并发相关的技术,所以对这些问题掌握很有帮助。
问题1:进程和线程的区别?
- 进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程;
- 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
- 线程:进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。
- 与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
- 根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
问题2:线程的状态及切换
- 由上图可以看出,线程创建之后将处于
new
状态,调用start()
方法之后卡视运行,线程这时候处于ready
状态,可运行状态的线程获得了cpu时间片后处于running
状态。 - 当线程执行
wait()
方法之后,线程进入waiting
状态,进入等待状态的线程需要依靠其他线程的通知才能返回到运行状态,而time_waiting
状态相当于再等待状态的基础上增加了超时限制,比如sleep(long millis)
方法或wait(millis)
方法可以将Java线程置于TIMED WAITING
状态。当超时时间到带后,Java线程将换回到RUNNABLE
状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将进入到BLOCKED
状态。线程再执行Runnable的run()
之后将会进入到TERMINATED
状态。
问题3:sleep() 和 wait() 的区别?
- 两者最主要的区别在于:
sleep()
⽅法没有释放锁,⽽wait()
⽅法释放了锁 。 - 两者都可以暂停线程的执⾏。
- Wait 通常被⽤于线程间交互/通信,
sleep()
通常被⽤于暂停执⾏。 -
wait()
⽅法被调⽤后,线程不会⾃动苏醒,需要别的线程调⽤同⼀个对象上的notify()
或者notifyAll()
⽅法。sleep()
⽅法执⾏完成后,线程会⾃动苏醒。或者可以使⽤wait(long timeout)
超时后线程会⾃动苏醒。
问题4:调用start()方法会执行run()方法,为什么不直接调用run()方法
-
new
⼀个 Thread,线程进⼊了新建状态; - 调⽤
start()
⽅法,会启动⼀个线程并使线程进⼊了就绪状态,当分配到时间⽚后就可以开始运⾏了; -
start()
会执⾏线程的相应准备⼯作,然后⾃动执⾏run()
⽅法的内容,这是真正的多线程⼯作; - ⽽直接执⾏
run()
⽅法,会把run()
⽅法当成⼀个 main线程下的普通⽅法去执⾏,并不会在某个线程中执⾏它,所以这并不是多线程⼯作; - 调⽤ start ⽅法⽅可启动线程并使线程进⼊就绪状态,⽽
run ()
⽅法只是 thread 的⼀个普通⽅法调⽤,还是在主线程⾥执⾏。
问题5:并发的特性?
- 1)原⼦性 :一个操作或者多次操作,要么所有操作全部得到执行并且不会受到任何因素的干扰而打断,全部执行成功,要么都不执行;
Sychronized
可以保证代码片段的原子性;volatile
没法保证。 -
2)可见性:当一个线程对共享变量做了修改,那么其他的线程都是可以立即看到修改后的最新值。
volatile
可以保证可见性。 -
3)有序性:代码在执行过程的先后顺序,Java在编译器及运行期间的优化,代码的执行顺序未必是按照编写的代码顺序执行,只要不存在资源关联的两个指令,那么他们的先后顺序不一定。
volatile
可以禁止指令重排。
问题6:上下文切换?
- 多线程编程中⼀般线程的个数都⼤于 CPU 核⼼的个数,⽽⼀个 CPU 核⼼在任意时刻只能被⼀个线程使⽤,为了让这些线程都能得到有效执⾏,CPU 采取的策略是为每个线程分配时间⽚并轮转的形式。当⼀个线程的时间⽚⽤完的时候就会重新处于就绪状态让给其他线程使⽤,这个过程就属于⼀次上下⽂切换。
- 概括来说就是:当前任务在执⾏完 CPU 时间⽚切换到另⼀个任务之前会先保存⾃⼰的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是⼀次上下⽂切换。
这里先介绍一些并发的基础问题,这部分问题也涉及到底层的操作系统的问题,因为并发就跟线程和进程相关,进程和线程就关联到了操作系统,所以这里先给大家整理一些前奏问题,这些问题也是实际面试中常问的问题。
文章会持续更新,后续还会更新一些本人或者同学在实际秋招中遇到各个公司的笔试或面试题。请大家多多关注!!!谢谢大家!!!
若文中有不准确的地方,或者有其他任何问题,欢迎留言+评论。
上一篇文章:面试之Java基础问题(3)
============