多线程相关面试题

1、并行和并发有什么区别

并行:多个任务同时在计算机中同时执行。并发:多个任务同时在计算机交替执行。

2、线程和进程的区别

进程是资源分配和程序运行的基本单位,一个进程至少有一个线程也可能有多个线程。

3、Java创建多线程有哪几种方式?

三种,分别是继承Thread类,实现Runnable接口和Callable接口。

4、runnable接口和Callable接口有什么不同?

返回值不同。runnable接口没有返回值,Callable接口有返回值,其中Callable接口的返回值是一个泛型。处理异常的方式不一样,Callable接口的call方法可以抛出异常,可以获取异常信息,Runnable接口的run方法只能抛出运行时异常。

5、线程包括那些状态,它们是怎么转换的?

六种状态,新建,可运行,终结、阻塞,等待,有时限等待

6、Wait和Sleep方法有什么不同?

三个层面不同:

第一、方法归属不同:sleep是Thread的静态方法,而wait方法是Object的方法,每个对象都有。

第二、唤醒时机不同:sleep方法可以设置休眠时间,但是Wait方法想要被唤醒必须调用notify方法唤醒线程。

第三、锁特性不同:调用wait方法必须先获取wait对象的锁,sleep就不用。wait方法执行后会释放锁,其他线程也可以获得锁对象,但是sleep如果在sychronized的代码块中执行是不会释放锁的。

7、T1、T2、T3怎么保证三个线程按顺序执行?

调用join()方法,比如先让T3调用T2,T2在调用T1就可以按顺序执行了

8、run方法和start方法有什么区别?

start方法用来启动线程,调用该方法会调用run方法执行run方法中的逻辑代码,start方法只可以被调用一次,但是run方法封装了要被线程执行的代码,可以被调用多次。

9、如何停止一个正在进行的线程?

三种方式。

1、使用退出标记

2、调用stop方法强制结束线程(不推荐)

3、使用interrept强制打断线程

10、synchronized关键字底层原理?

synchronized的底层原理是JVM级别的monitor来决定当前线程是否获得了锁,若一个线程得到了锁却没有释放锁,其他线程是得不到锁的。synchronized属于悲观锁。

11、讲一下monitor?

12、synchronized的锁升级情况?

13、ReentrantLock的使用方式和底层原理?

底层原理:CAS+AQS队列实现的。它支持公平锁和非公平锁。

使用方式:reentrantLock是一个可重入锁,调用LOCK方法获取锁后,再次调用lock是不会阻塞的,内部直接增加重入次数就可以了,标识这个线程已经重复获取一把锁而不需要等待锁的释放。

14、介绍一下CAS和AQS?

CAS:比较再交换

AQS:阻塞式锁和相关的同步器工具框架。

15、synchronized和Lock有什么区别?

1、语法层面不同:synchronized是C++语言实现的,退出同步代码块会自动释放锁,LOCK底层是JAVA语言实现的,需要手动调用unlock方法释放锁

2、功能层面不同:两个锁都是悲观锁,LOCK可以提供获取等待状态,公平锁,可打断,可超时、多条件变量。

3、性能层面不同:在竞争不激烈时,synchronized可以有更好的性能,竞争激烈时,LOCK的性能更加好一点。

16、死锁产生的条件是什么?

一个线程同时需要多把锁。

17、如何进行死锁诊断?

18、请讲一下Volatile关键字?

19、ConcurrentHashMap的原理

ConcurrentHashMap是一种线程安全的map集合,在JDK1.7和1.8分别有不同的结构,jdk1.7使用的是数组加链表,jdk1.8使用的是数组加链表/红黑树。

jdk1.7中concurrentHashMap里面包含了一个segement数组,每一个segement数组有包含了一个hashEntry。当对hashEntry数组进行数据修改时,必须先获取对应的segement的锁。

jdk1.8中,就放弃了segement数组,取而代之的是Node+CAS+Synchronized来保证并发安全实现,synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率提升。

20、线程池的种类?

21、线程池的核心参数有哪些?

有七个核心参数

1、核心线程数目、2、最大线程数目、3、生存时间、4、时间单位、5、工作队列、6、线程工厂、7、拒绝策略

22、如何确定核心线程池?

23、线程池的执行原理?

24、为什么不建议使用Executors创建线程池呢?

25、如何控制某一个方法允许并发访问线程的数量?

26、导致并发程序出现问题的根本原因是什么?

27、如何保证Java程序在多线程的情况下执行安全呢?

28、对ThreadLocal的理解?

ThreadLocal的功能主要有两个 第一个实现线程的资源隔离,第二个就是线程内的资源共享。

29、ThreadLocal的底层原理?

ThreadLocal底层是存在一个ThreadLocalMap成员变量,用来存储资源对象。

当调用set方法时,Threadlocal自己会作为key,资源对象会作为value,放入到ThreadLocalMap中。

当调用get方法时,Threadlocal自己会作为key,到当前线程中查找关联的资源值。

当调用remove方法时,Threadlocal自己会作为key,移除当前线程关联的资源值。

30、讲一下ThreadLocal的内存溢出问题?

因为ThreadLocalmap中的key被设计为弱引用,会被动的被GC调用释放key,只会释放key但是value是不会释放的,因为value是一个强引用。

那么要想解决这个问题就可以把ThreadLocal作为静态变量,无法被动的被GC回收,手动remove释放key,就会避免了内存溢出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值