多线程面试题

多线程是我们学习当中的一大难点,正因如此,在面试中面试官会经常问到多线程相关的问题,如果你都对答如流是非常加分的。那么就总结下在面试中常被问到的多线程面试题:

1、什么是线程?线程和进程的关系?

⼀般们可以这么

线程是操作系统中能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

进程:进程是程序的一次执行过程,系统运行是一个程序即是一个进程从创建到运行再到消亡的过程。

线程:线程是一个比进程更小的执行单元,一个进程在执行过程中可以产生多个线程。

2 、实现线程有哪几种方式?

⼀般们可以这么

(1)进程Thread类创建多线程;

(2)实现Runnable接口,实现run()方法;

(3)实现Callable接口创建多线程;

(4)通过线程池创建线程

3、说下并发和并行的区别?

 ⼀般们可以这么

并发:同一时间段内,多个任务都在执行。(单位时间不一定同时执行)

并行:单位时间内,多个任务同时执行。

举个例⼦助⼤解:

你吃饭吃到⼀半,来了你停了下来了电话,接后继续吃饭这说明你⽀持并发你吃饭吃到⼀半,来了你⼀边打电⼀边吃饭这说明你⽀持并⾏

4、 说说线程的生命周期有哪几个阶段?

⼀般我们可以这么答:

  • 线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。
  • 新建:就是刚使用new方法,new出来的线程;
  • 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU 资源,谁开始执行;
  • 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
  • 阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如

sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,

比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进⼊运行状态;

  • 销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;

5、 什么是线程安全?能说一个业务场景需要线程安全吗?

 ⼀般们可以这么

线程全指的是当⼀个线程在操作⼀个⽅法者语句时其它线程不能对其进行操作只能 等到该线程才可以进行访问

比如生产者消费者模式中库存的数量就需要保证线程安全否则当多个线程进行操作 就可能导致脏读的发生因为多个线程可能读到的是相同的值从而导致库存总量超

6、多线程并发 或线程安全问题如何解决?

 ⼀般们可以这么

(1)synchronized锁(任意对象)来实现线程同步,⾃动锁的思想。

底层实现原理:当有线程⼊同步代码块之,利⽤jvm数器锁的标置为1,当别的线程再想的时候,发现锁的标1, 该线程就去锁池等待,当第⼀个线程出来之,锁的标记会置为0,cpu机分配⼀个线程再次进⼊同步代码块.

(2) 通lock锁,进行手lock,unlock,但是这种容易出现死锁注意锁以及解锁的顺序,就可以避免死锁。

(3)通过线程全的集合,可以决并发问题

         ConcurrentHashMap CopyonWriteArrayList

(4)使⽤线程池来创建和管理线程,也可以⼀定程度上决并发问题

7、什么是线程死锁?如何避免死锁 

 ⼀般们可以这么

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若五外力作用,它们都将无法推进下去。这是⼀个严重的问题因为死锁让你的程序起无法完成任务死锁的发生必须满足以下四个条件:

避免死锁最单的方法就是阻止循等待条件,将系统中所有的资源设置标志位排序,规定所有的程申请     资源必须以⼀定的顺序升序或降做操作来避免死锁

  • 互斥条件⼀个资源每次只能被⼀个程使用
  • 请求与保持条件⼀个程因请求资源而阻塞时对已得的资源保持不放
  • 不剥夺条件:进程已得的资源在末使用完之前不能强行剥夺
  • 循环等待条件若干程之形成⼀种头尾相的循等待资源系。 
    避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位,排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。
     

8、  synchronized,Lock 有什么区别?

 ⼀般们可以这么

  • Lock 是⼀个,而synchronized  Java 中的关键synchronized 是内置的语言实现
  • Lock 在发生异常时没有主动通unLock() 去释放锁,很可能造成死锁现象因此使用Lock 时需要在 finally 块中释放锁synchronized 在发生异常时,会自动释放锁因此不导致死锁现象发生
  • Lock 的使用更活,可以有响应中断有超时时synchronized 却不行使用 synchronized 等待的线程⼀直等待下去直到取到锁

9、说说你对乐观锁和悲观锁的理解?

  ⼀般们可以这么

乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题:

  • 乐观锁:乐观锁在操作数据时非常乐观,认为别⼈不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断⼀下在此期间别⼈是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。
  • 悲观锁:悲观锁在操作数据时⽐较悲观,认为别⼈会同时修改数据。因此操作数据时直接把数据锁住,   直到操作完成后才会释放锁;上锁期间其他⼈不能修改数据。

10、什么是线程池?

⼀般们可以这么

线程池是指在初始化应用程序的过程中创建的一个线程集合,之后每次执行新的任务的时候重用这些线程而非新建一个线程。作用就是提高资源的利用率,提高线程的可管理性。

11、Runnable接口和Callable接口有何区别? 

⼀般们可以这么

相同点

  • RunnableCallable都是接口
  • 都可以编写多线程程序
  • 都采用Thread.start()启动线程

不同点

  • Runnable接口run方法无返Callable接口call方法有返是个泛型,和FutrueFutureTask合用取异步执行结果
  • Runable接口run方法只能抛出运行时的异常且无法捕处理Callable接口call方法允许抛出异可以取异常信息
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值