0
点赞
收藏
分享

微信扫一扫

多线程相关面试题

1 、什么是进程?什么是线程?

进程 是操作系统分配资源的最小单元

线程 是操作系统调度的最小单元。

一个程序至少有一个进程 , 一个进程至少有一个线程。

2 JVM JRE JDK 的关系?

JVM :( Java Virtual Machine ), Java 虚拟机。它能识别 .class 后缀的文件,并且能够解析它的指令,最终调用操

作系统上的函数,完成我们想要的操作。

3 JVM 中可以运行多种语言吗?

图灵学院 JVM 只识别字节码,所以 JVM 其实跟语言是解耦的,也就是没有直接关联。

Scala Groovy Kotlin 等等语言都可以在JVM上运行

4 JVM 有哪些内存区域?

虚拟机栈 :在 JVM 运行过程中存储当前线程运行方法所需的数据,指令、返回地址。

本地方法栈 :本地方法栈是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。

程序计数器 :主要用来记录各个线程执行的字节码的地址。

方法区 JDK1.7 及之前 永久代 JDK1.8 及以后 元空间 ,存放类的信息、常量池、方法数据、方法代码

:堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在堆中存储。

 

 

5 、堆空间大小怎么配置?各区域怎么划?

 

6 JVM 中哪些内存区域会发生内存溢出 (OOM)

栈溢出

堆溢出

方法区溢出

本机直接内存溢出

7 JVM 在创建对象时采用了哪些并发安全机制?

 

 

 

本地线程分配缓冲( Thread Local Allocation Buffffer,TLAB

每个线程在 Java 堆中预先分配一小块私有内存,也就是本地线程分配缓冲,这样每个线程都单独拥有一个 Buffffer

如果需要分配内存,就在自己的 Buffffer 上分配,这样就不存在竞争的情况,可以大大提升分配效率

8 、什么是对象头?对象头里面有哪些东西?

 

9 、为什么不要使用 Finalize 方法?

一个对象要被回收,需要经过两次标过程,一次是没有找到与 GCRoots 的引用链,它将被第一次标记。随后进行一

次筛选(如果对象覆盖了 fifinalize ),我们可以在 fifinalize 方法中去拯救(变为存活对象)。

1 fifinalize 方法执行线程优先级很低

2 fifinalize 方法只能执行一次

10 、怎么判断对象的存活?

引用计数法

可达性分析算法

11、什么是复制算法?它有什么优缺点?  

 

12、什么是标记清除算法?它有什么优缺点?

 

13、什么是标记整理算法?它有什么优缺点?  

14、扩容新生代为什么能提高GC的效率?  

15、阐述下CMS垃圾回收器,它有哪些问题?  

Concurrent Mark Sweep

步骤

初始标记

并发标记

重新标记

并发清除

CMS 中的问题:

CPU 敏感

浮动垃圾

内存碎片 --- 垃圾回收器 退化 SerialOld 单线 程的垃圾回收( 标记整理算法

16 、在 java 中守护线程和用户线程的区别?

java 中的线程分为两种: 守护线程( Daemon )和用户线程( User )。

守护线程通过调用 Thread.setDaemon(true) 设置。

一般程序使用的都是用户线程。

守护线程我们一般用不上,比如垃圾回收线程就是守护线程( Daemon )。

使用守护线程注意点

1.Thread.setDaemon() 必须在 Thread.start() 之前调用,否则运行时会抛出异常。

2. 守护线程( Daemon )是为其他线程提供服务,如果全部的 User Thread 已经结束,守护线程没有可服务的线

程, JVM 关闭。

17 、什么是多线程中的上下文切换?

 

18、什么是死锁?死锁的危害?

 

19、在JavaExecutor和Executors的区别?  

20、什么是CAS操作,缺点是什么?  

21 Lock 接口 (Lock interface) 是什么?对比 synchronized 它有什么优

势?

Lock 接口比同步方法和同步块提供了更具扩展性的锁操作。

Lock synchronized 的扩展版, Lock 提供了无条件的、可轮询的 (tryLock 方法 ) 、定时的 (tryLock 带参方法 ) 、可中

断的 (lockInterruptibly) 、可多条件队列的 (newCondition 方法 ) 锁操作。另外 Lock 的实现类基本都支持非公平锁 (

) 和公平锁, synchronized 只支持非公平锁,当然,在大部分情况下,非公平锁是高效的选择。

22 、什么是阻塞队列?阻塞队列的实现原理是什么?

 

阻塞队列( BlockingQueue )是一个支持两个附加操作的队列。

这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待

队列可用。

阻塞队列在实现上,主要是利用了 Condition Lock 的等待通知模式。

23 、什么是 Callable Future?

Callable 接口类似于 Runnable ,从名字就可以看出来了,但是 Runnable 不会返回结果,并且无法抛出返回结果的

异常

Callable 功能更强大一些,被线程执行后,可以返回值,这个返回值可以被 Future 拿到,也就是说, Future 可以

拿到异步执行任务的返回值。

Callable 可以认为是带有回调的 Runnable

Future 接口表示异步任务,是还没有完成的任务给出的未来结果。所以说 Callable 用于产生结果, Future 用于获取

结果。

24 、什么是 FutureTask?

FutureTask 表示一个可以取消的异步运算。它有启动和取消运算、查询运算是否完成和取回运算结果等方法。只有

当运算完成的时候结果才能取回,如果运算尚未完成 get 方法将会阻塞。

一个 FutureTask 对象可以对调用了 Callable Runnable 的对象进行包装,由于 FutureTask 也是调用了 Runnable

口所以它可以提交给 Executor 来执行。

25 、什么是并发容器的实现?

并发容器可以简单地理解为通过 synchronized 来实现同步的容器,如果有多个线程调用同步容器的方法,它们将会

串行执行。比如 Vector Hashtable ,以及 Collections.synchronizedSet synchronizedList 等方法返回的容器。

ConcurrentHashMap

26 、为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接

调用 run() 方法?

当你调用 start() 方法时你将创建新的线程,并且执行在 run() 方法里的代码。

图灵学院 但是如果你直接调用 run() 方法,它不会创建新的线程也不会执行调用线程的代码,只会把 run 方法当作普通方法去

执行。

27 、什么是不可变对象,它对写并发应用有什么帮助?

不可变对象 (Immutable Objects) 即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之

即为可变对象 (Mutable Objects)

Java 平台类库中包含许多不可变类,如 String 、基本类型的包装类、 BigInteger BigDecimal 等。

不可变对象天生是线程安全的。它们的常量(域)是在构造函数中创建的。既然它们的状态无法修改,这些常量永远不会变。

28 、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样

别人想拿这个数据就会阻塞直到它拿到锁。 Java 里面的同步原语 synchronized 关键字的实现是悲观锁。

乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会

判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。在 Java 中原子变量类就是使用了乐观锁的

一种实现方式 CAS 实现

乐观锁的实现方式:

· 使用版本标识来确定读到的数据与提交时的数据是否一致。提交后修改版本标识,不一致时可以采取丢弃和再次

尝试的策略。

· java 中的 Compare and Swap CAS ,当多个线程尝试使用 CAS 同时更新同一个变量时,只有其中一个线程能更

新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

29 、在 java wait sleep 方法的不同?

最大的不同是在等待时 wait 会释放锁,而 sleep 一直持有锁。 Wait 通常被用于线程间交互, sleep 通常被用于暂停执行。

30 、为什么 wait, notify notifyAll 这些方法不在 thread 类里面?

JAVA 提供的锁是对象级的而不是线程级的锁。

每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的 wait() 方法就有意义了。

如果 wait() 方法定义在 Thread 类中,线程正在等待的是哪个锁就不明显了。

简单的说,由于 wait notify notifyAll 都是锁级别的操作,所以把他们定义在 Object 类中因为锁属于对象。

 

 

举报

相关推荐

0 条评论