面试题:多线程

190 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

个人简介:微信公众号关注:SteveCode。为您分享更多的知识学术。生于忧患死于安乐 专注Java技术干货分享,Java基础技术、数据结构、相关工具、Spring全家桶、intellij idea......

文章面试题整理出自:Java 最常见的 200+ 面试题:面试必备_Java中文社群的博客-CSDN博客_java面试题

要么做好要么不做

35.并行和并发有什么区别?

并行:不同实体处理多个事件(三个人吃三个馒头)

并发:同一实体处理多个事件(一个人吃三个馒头)

36.线程和进程的区别?

进程:就是应用程序的执行

线程:是进程中最小执行单元

37.守护线程是什么?

守护线程就是运行在后台的一种特殊进程。Java中垃圾回收线程也是特殊的守护线程。

38.创建线程有哪几种方式?

继承thread类

实现Runnable接口

实现Callable接口

39.说一下 runnable 和 callable 有什么区别?

相同点:两者都是接口、两者都是用来编写多线程、两者都是用Thread.start()启动线程。

不同点:runnable中run方法没有返回值,callable接口中call方法需要返回值。

callable接口中call方法解决了异常问题

public interface Callable {     V call() throws Exception; }

runnable接口run方法中需要抛出异常。

public interface Runnable {     public abstract void run(); }

40.线程有哪些状态?

新生态、就绪态、阻塞态、运行态、死亡态

41.sleep() 和 wait() 有什么区别?

www.cnblogs.com/116970u/p/1…

类不同:sleep()在Thread类,且是一个静态方法

wait()在object类中,是一个实例方法

对象锁:sleep()不能释放锁资源,wait可以释放锁资源

唤醒线程方式:sleep()到时间自动恢复,wait需要使用notify  或者notifyAll唤醒线程。

使用范围:sleep()可以在任何地方使用,wait()只能咋同步代码与同步方法上使用。

42.notify()和 notifyAll()有什么区别?

blog.csdn.net/djzhao/arti…

如果对象调用wait()方法,那么对象就会进入等待池中。等待池中的线程不会去竞争对象锁。

notify()唤醒一个线程去锁池中去竞争对象锁,notifyAll()是唤醒所有线程进入锁池中,去竞争对象锁。

43.线程的 run()和 start()有什么区别?

run()指的是执行线程的运行代码。start()启动某一线程。

44.创建线程池有哪几种方式?

创建一个可以缓存的的线程池newCachedThreadPool

创建一个单线程的线程池newSingleThreadExecutor

单单线程可以周期执行任务的线程池:newSingleThreadScheduledExecutor

创建有个指定数目的线程池:newFixedThreadPool 定长

创建一个可以周期执行任务的线程池:newScheduledThreadPool

45.线程池都有哪些状态?

Runtime、 SHUTDOWN、STOP、TIDYING 、TERMINATED

46.线程池中 submit()和 execute()方法有什么区别?

所在类不同:submit()在abstractExecuteService方法中,execute()在Executor中。

返回值:submit()有返回值,execute()没有返回值

参数不同:execute 的参数:runnable

submit参数:runnable、callable

execute()public interface Executor {     void execute(Runnable command); } submit() public abstract class AbstractExecutorService implements ExecutorService {     public Future<?> submit(Runnable task) {}     public Future submit(Callable task) {} }

47.在 java 程序中怎么保证多线程的运行安全?

使用线程安全的类:Hashtable、vector、或者java.util.concurrent 下面的线程安全类;

image.png 使用同步锁synchronized

使用Lock自动锁

blog.csdn.net/meism5/arti…

48.多线程锁的升级原理是什么?

无锁---偏向锁---轻量级锁---重量级锁,随着竞争情况,锁的状态逐渐升级,状态不能降级。blog.csdn.net/weixin_4292…

49.什么是死锁?

如果A线程持有a锁,B线程持有b锁,他们俩之间想相会持有对方锁,从而产生了相互等待现象。称为死锁。

50.怎么防止死锁?

使用并发类代替代替手写锁:java.util.concurrent。

尽量少些同步代码块与同步方法。

设置死锁时间,超出自当退出

51.ThreadLocal 是什么?有哪些使用场景?

ThreadLocal是线程本地存储,每一个线程都会有一个ThreadLocalMap对象,每个线程都可以访问ThreadlocalMap中的 value

场景,每一个jdbc链接Connection,每一个线程都会有自己的connection进行数据库的操作。

session管理。

blog.csdn.net/meism5/arti…

52.说一下 synchronized 底层实现原理?

www.cnblogs.com/paddix/p/53…

每个锁对象都有monitor对象来完成。

53.synchronized 和 volatile 的区别是什么?

修饰上:synchronization 可以修饰代码块,类、方法、变量

volatile只能修饰变量

阻塞上:synchronization会产生阻塞,volatile不会产生阻塞。

synchronization可以保证修改可见性与原子性,volatile可以实现修改可见性,不能保证原子性

54.synchronized 和 Lock 有什么区别?

来源上:synchronization是一个关键字,Lock是一个接口

异常是否释放锁:synchronization出现异常时会释放锁,lock出现异常时不会释放锁,我们需要在try  catch  finally{调用 unlock}开启释放锁

等待是否可以中断:前者不能不能中断,要么异常、要么执行完成

后者可以中断:可设置超时方法()

image.png  

55.synchronized 和 ReentrantLock 区别是什么?

blog.csdn.net/meism5/arti…

获取锁:前者竞争锁时一直等待,后者可以尝试获取锁,并获取结果

设置获取锁的超时时间:前者不能设置,后者可以设置超时时间。

公平锁:前者不能实现公平锁。后者可以实现公平锁,先等待先获取

唤醒的方式不同:前者wait() notify() notifyAll(),后者 await()signal()signalAll()

实现:前者jvm实现,后者jdk实现

释放锁:前者在代码执行完了之后或者抛出异常会自动释放锁,后者不会自动释放锁,finally{unlock}去释放锁

56.说一下 atomic 的原理?

atomic主要运用(cas)确实线程安全,但是适用的范围场景比较小。

blog.csdn.net/zhangerqing…