Java多线程与并发基础

CS-LogN思维导图:记录专业基础 面试题
开源地址:https://github.com/FISHers6/CS-LogN

Java多线程与并发基础

多线程与并发基础 实现多线程 面试题1:有几种实现线程的方法,分别是什么

1.继承Thread类,启动线程的唯一方法就是通过 Thread 类的 start()实例方法,start()方法是一个 native 方法,它将启动一个新线程去执行 run()方法

2.实现 Runnable 接口,重写run()函数,作为参数放到Thread类构造函数中作为target属性,运行start()方法

线程池创建线程、Callable本质还是使Runnable创建,Callable是父辈类继承了Runnable,线程池需传入参数

面试题2:实现Runnable方法好,还是继承Thread类好

实现Runnable接口更好

1.单一继承原则,如果继承了Thread,就不能继承其它类了,限制了可扩展性

2.Thread类每次只能创建一个独立的线程,损耗大,而Runnable能利用线程池工具来创建线程

3.从代码架构上看,run内容应该与Trhead代码解耦

面试题3:一个线程两次调用start方法会出现什么情况(考察源码)

第二次会出现异常,从start源码上和线程生命周期上分析,一个线程start后,
改变了threadState状态字;而第二次再start每次会先检查这个状态不是0就报异常

面试题4:既然start方法会调用run方法,为什么我们还是要用start方法,而不是直接调用run方法呢(考察源码)

因为start后线程才会经过完整的线程生命周期,start调用native start0,虚拟机执startThread,thread_entry入口中调用Thread的run,

面试题5:start和run有什么区别

run()方法:只是普通的方法,调用run普通方法,可以重复多次调用

start()方法,会启动一个线程,使得虚拟机去调用Runnable对象的run()方法,不能多次启动同一个线程

面试题6:start方法如何调用run方法的(考察源码和JVM)

start方法调用native start0,JVM虚拟机执行startThread,在thread_entry中调用Thread的run方法

面试题7:如何正确停止线程

使用interrupt中断通知,而不是强制,中断通知后会让被停止线程去决定何时停止,即把主动权交给需要被中断的线程

线程的生命周期 面试题1:Java线程有哪几种状态 说说生命周期

六种生命状态(若time_waiting也算一种)

New,已创建但还尚未启动的新线程

Runable,可运行状态;对应操作系统的两种状态“就绪态” 和 “运行态”(分配到CPU)

Blocked,阻塞状态;请求synchronized锁未分配到时阻塞,直到获取到monitor锁再进入Runnable

Waiting,等待状态

Timed waiting,限期等待

Terminated终止状态

线程的生命周期 状态转换图

Thread和Object类中

与线程相关的重要方法

面试题1:实现两个线程交替打印奇数偶数 面试题2:手写生产者消费者设计模式,为什么用该模式

主要是为了解耦,匹配不同的能力

面试题3:wait后发生了什么,为什么需要在同步代码内才能使用

从jvm的源码实现上看,wait后,线程让出占有的cpu并释放同步资源锁;把自己加入到等待池,以后不会再主动参与cpu的竞争,除非被其它notify命中

为了确保线程安全;另外wait会释放资源,所以肯定要先拿到这个锁,能进入同步代码块已经拿到了锁

面试题4:为什么线程通信的方法wait,notify和notifyAll放在Object类,而sleep定义在Thread类里 (考察对象锁)

与对象的锁有关,对象锁绑定在对象的对象头中,且放在Object里,使每个线程都可以持有多个对象的锁

面试题5:wait方法是属于Object对象的,那调用Thread.wait会怎么样

线程死的时候会自己notifyAll,释放掉所有的持有自己对象的锁。这个机制是实现很多同步方法的基础。如果调用Thrad.wait,干扰了我们设计的同步业务流程

面试题6:如何选择notify还是notifyAll

优先选用notifyAll,唤醒所有线程;除非业务需要每次只唤醒一个线程的

面试题7:notfiy后发生的操作,notifyAll之后所有的线程都会再次抢夺锁,如果某线程抢夺失败怎么办?

notify后,让waiterSet等待池中的一个线程与entry_List锁池一级活跃线程一起竞争CPU

抢夺锁失败后会继续待在原锁池或原等待池,等待竞争CPU的调度

面试题8:sleep方法与notify/wait方法的异同点

相同点:线程都会进入waiting状态,都可以响应中断

不同点:1.所属类不同;2.wait/notify必须用在同步方法中,且会释放锁;3.sleep可以指定时间

面试题9:join方法后父线程进入什么状态

waiting状态,join内部调用wait,子线程结束后自动调用notifyAll唤醒(jvm:exit函数)

线程安全与性能 面试题1:守护线程和普通线程的区别

守护线程是服务于普通线程的,并且不会影响到jvm的退出

面试题2:什么是线程安全

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgwfd.html