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,就会避免了内存溢出。