多线程面试题整理

1.java创建线程后,直接调用start和run方法的区别
启动一个线程是调用start()方法,使线程所代表的虚拟机处于可运行状态,这意味着需要jvm调度并执行。并意味着线程会立即运行。Run方法可以产生必须退出的标志来停止一个线程

2.线程a怎么知道线程b修改了变量
Volatile修饰变量
Synchronized修饰修改变量的方法
Wait/notify
While 轮询

3.Synchronize和volatile、CAS比较
Synchronize是悲观锁,抢占式,会引起其他线程阻塞
Volatile提供多线程共享变量的可见性和禁止指令重排序优化
CAS是基于冲突的乐观锁(非阻塞)

4.线程间通信,wait和notify的理解和使用
Wait和notify必须配合synchronized关键字使用
Wait方法释放锁,notify方法不释放锁
还要注意一点,就是涉及线程之间的通信,就会用到volatile修饰

5.定时线程的使用
普通线程死循环
使用定时器timer
使用定时调度线程池ScheduleExecuteService

6.线程同步的方法
Wait():使一个线程处于一个等待的状态,并且释放所持有的对象的锁
Sleep():是一个运行的线程处于休眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常
Notify:唤醒一个处于等待状态的线程,注意调用此方法并不是确切的唤醒某一个等待状态的线程,而是由jvm确定唤醒那个线程,而且不是按优先级
notifyAll:唤醒所有处于等待状态的线程,注意并不是给所有线程一个锁,而是让他们竞争

7.进程与线程的区别
调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
并发性:不仅进程之间可以并发执行,同一个进程的多线程也可以并发执行
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源

8.什么叫线程安全
如果你的代码所在的进程中有多个线程同时运行,二这些线程可能会同时运行这段代码,如果每次运行结果与单线程运行的结果是一样的,而且其他变量的值与预期的是一样的,就是线程安全

9.线程的几种状态
创建,就绪,运行,阻塞(等待阻塞、同步阻塞、其他阻塞),死亡
New、Runnable、blocked、waiting、timed waiting、terminated

10.Volatile变量和atomic变量的区别
Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前并不能保证原子性,而AtomicInteger类提供的atomic方法可以让这种操作具有原子性

11.Java中如何停止一个线程
当run()或者call方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile布尔变量来退出run()方法或者是取消任务来中断线程

12.线程池的优点
重用存在的线程,减少对象创建销毁的开销
可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源的竞争,避免阻塞
提供定时执行,定期执行,单线程,并发数控制等功能

13.Volatile的理解
保证了不同线程对这个变量进行操作的可见性,即一个线程修改某个变量的值,这新值对其他线程来说是立即可见的
禁止进行指令重排序

14.实现多线程的几种方式
继承thread类
实现Runnable接口,重写run方法

15.Java中notify和notifyAll有什么区别
Notify:唤醒一个处于等待状态的线程,注意调用此方法并不是确切的唤醒某一个等待状态的线程,而是由jvm确定唤醒那个线程,而且不是按优先级
NotifyAll:唤醒所有处于等待状态的线程,注意并不是给所有线程一个锁,而是让他们竞争

16.什么是乐观锁和悲观锁
乐观锁:就像它的名字一样,对于并发间操作产生线程问题持乐观状态,认为竞争不会总是发生,因此它不需要持有锁,将比较—替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败表示发生冲突,那么就应该有相应的重试逻辑
悲观锁:就像它的名字一样,对于并发间操作产生线程问题持悲观状态,认为竞争总是发生,因此每次对某资源进行操作时,都会有一个独占的锁,就像synchronize,不管三七二十一,直接上了锁就操作资源了

17.线程的创建方式
继承thread类
实现Runnable接口
实现Callable接口
使用线程池的方式

18.线程池的作用
创建线程要花费昂贵的时间和资源,为了避免这个问题,在程序启动时,就创建若干线程来相应处理
作用即为上面线程的优点

19.Wait和sleep的区别
Sleep是线程类thread的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时候会自动恢复,调用sleep不会释放对象锁
Wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后线程才进入对象锁定池准备获得对象锁进入运行状态

20.产生死锁的条件
互斥条件
请求与保持条件
不剥削条件
循环等待条件

21.请写出实现线程安全的几种方式
使用同步代码块
使用同步方法
使用ReentrantLock

22.守护线程是什么,它与非守护线程的区别
程序运行完成完毕,jvm会等待飞守护的线程完成后关闭,但是jvm不会守护等待线程,守护线程最经典的例子就是GC线程

23.Callable和Runnable的区别是什么
两者都能用来编写多线程,但实现callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程不能返回结果,Callable通常需要和Future/Future结合所使用,用于获取异步计算的结果
(有无返回值)

24.线程阻塞有哪些原因
1.sleep允许
2.suspend()和resume两个方法配套使用
3.yield
4.wait和notify

25.Synchronized和lock的区别
相同点:lock能完成synchronized所实现的所有功能
不同点:lock有比synchronized更精确的线程语义和更好的性能。Synchronized会自动释放锁,而lock一定要求程序员手动释放,并且必须在finally从句中释放

26.ThreadLocal是什么?有什么作用?
是一个本地线程副本变量的工具类,主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景

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

28.什么是futrueTask
在java并发程序中FutureTask表示一个可以取消的异步运算,只有当运算完成的时候结果才能够取出。一个futrueTask可以对调也能用Callable和Runnable的对象进行包装,也调用Runnable接口所有它提交给Executor来执行

29.Java中intercepted和isInterrupt方法的区别
主要区别就是前者会将中断状态清除而后者不会

30.死锁的原因
是多个线程涉及多个锁,这些锁存在着交叉,所有可能会导致了一个锁依赖的闭环
默认的锁申请操作是阻塞的

31.什么是自旋
很多synchronized只是一些很简单的代码,执行时间非常快
是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。

32.怎么唤醒一个阻塞的线程
线程调用Wait()、sleep、join()方法而导致的阻塞,可以中断线程,可以通过抛出InterruptedException来唤醒它,io阻塞则无能为力

33.如果提交任务时,线程池队列已满,这时会发生什么
如果一个任务不能被调度执行,那么ThreadPoolExecutor’s submit()方法将会抛出一个RejectedExecutionException异常

34.什么是线程局部变量
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享

35.使用volatile关键字的场景
对变量的写操作不依赖于当前值
该变量没有包含在具有其他变量的不定式中

36.线程池的工作原理,几个重要参数
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime 线程存活时间
Unit存活时间单位
workQueue任务队列
threadFactory创建线程的工程
Handle拒绝策略

37.线程池的类型
有缓冲的线程池,线程数JVM控制
固定大小的线程池
单线程的线程池
默认线程池

38.线程池的阻塞队列有哪些
三种阻塞队列
基于数组的先进先出,有界
基于链表的先进先出,无界
无缓冲的等待队列,无界

39.线程池的拒绝策略有哪些
四种拒绝策略
默认,队列满了丢任务抛出异常
队列满了丢任务不异常,直接丢弃任务
将最早进入队列的任务删除,之后再尝试加入队列,抛弃队列中等待最久的任务,然后把当前任务加入到队列找那个尝试再次提交当前任务
如果添加到线程池失败,那么主线程会自己去执行该任务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值