多线程面试题-持续更新中....

123 阅读4分钟

并发编程这块的内容自己在平时的工作中基本没怎么使用过,之前学到的东西零零散散的也忘记的差不多了,准备把它系统的再学习一下,并且把在学习过程中遇到的面试题记录一下,方便以后复习的时候看, 大家有什么面试题可以发出来,我收录进来,众人拾柴火焰高。

一、线程和进程的区别?

进程:是指在系统中正在运行的一个应运程序,当一个程序进入内存运行,即变成一个进程,进程是属于运行过程中的一个程序,每个进程之间是独立的,每个进程均运行在自己专用且受保护的内存中。

线程:线程是进程中的一个执行单元,也是cpu调度和分配的基本单位。

进程是资源分配的最小单位,线程是CPU调度的最小单位

线程是进程的一部分,一个线程只属于一个进程,一个进程中有多个线程,至少有一个线程。

二、并发和并行有什么区别?

并发:多个任务在同一个cpu上,按照cpu的时间片轮流交替执行,由于时间很短,看上去好像同时进行的。

并行:单位时间内,多个处理器或者多核处理器同时处理多个任务,时真正意思上的同时进行。

三、并发编程的三要素?

  • 原子性:一个或多个操作要么全部执行成功,要么全部执行失败;线程上下文的切换会带来原子性问题,Tromic开头的原子类、synchronized、lock,可以解决原子性问题。
  • 可见性:多个线程对共享变量进行修改时,其中一个线程修改,其他线程能够看到修改的结果。缓存会导致可见性问题,synchronized、volatile、lock可以已解决可见性问题。
  • 有序性:程序的执行顺序按照代码的先后顺序执行。编译优化会带来 有序性问题,Happens-Before规则可以解决有序性问题。

四、什么是多线程?多线程的优缺点?

定义:多线程是指程序中包含多个流,即在一个程序中可以同时进行多个不同的线程来执行不同的任务。

优点

  • 可以提高cpu的利用率,在多线程中,一个线程必须等待的时候,cpu可以运行其他线程而不是等待,这样就大大提高了程序的效率,也就是说单个程序可以创建多个不同的线程来完成各自的任务。

缺点

  • 线程也是程序,线程也需要占内存,线程多内存占的多
  • 多线程需要协同和管理,素以需要cpu跟踪线程。
  • 线程之间共享资源的访问会互相影响,必须解决禁用共享资源的问题。

五、run()和start()的区别

首先回答为什么启动线程不能直接调用run()方法,而是调用start()方法,我们从以下4个方面来回答:

  1. start()方法是java线程约定的内置方法,能够确保代码在新的线程上下文中运行。
  2. start()方法包含了除创建新线程的特殊代码逻辑,run()方法是我们自己写的代码,很显然没有这个能力。
  3. 如果直接调用run()方法,那么它是一个普通的方法调用,程序中依然只有一个主线程,并且只能顺序执行,需要等待run()方法执行结束后才能继续执行后面的代码。
  4. 我们创建线程目的是为了更充分利用cpu资源,如果直接调用run()方法,就失去了创建线程的意义了。

六、两次调用start()的后果

在java中,线程的start()只能被调用一次,如果第二次调用会抛出IllegalThreadStateException异常,这是一种运行时异常,多次调用start被认为是编程错误。

在我们第一次调用start()方法的时候,线程可能处于终止或者其他非NEW的状态,再次调用start()方法的时候,相当于让这个正在运行的线程重新运行一遍。不管是从线程安全的角度来看,还是从线程本身的执行逻辑来看,它都是不合理的。