1、线程和进程的区别
根本区别:进程是操作系统资源分配的基本单位,线程是任务调度和执行的基本单位
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间
关系:一个程序至少一个进程,一个进程至少一个线程

2、thread和runnable的关系
1、如果一个类继承thread,则不适合资源共享。但是如果实现了runnable接口的话,则很容易的实现资源共享
2、runnable是接口,thread是类,且实现了runnable接口
3、实现runnable接口相比继承thread类有如下好处:避免了继承的局限性,一个类可以实现多个接口

3、synchronized底层如何实现?锁优化?怎么优化?
它是java内建的同步机制,所以也有人称其为intrinsic locking,他提供了互斥语义和可见性,当一个线程已近获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里
原理:synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
锁优化:jdk1.6对锁的实现引入了大量的优化。锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,注意:锁可以升级不可降级,这种策略是为了提高获得锁和释放锁的效率。
1、偏斜锁:当没有竞争出现时,默认会使用偏斜锁。
2、自旋锁:就是让该线程等待一段时间,不会被立即挂起,看持有锁的线程是否会很快释放锁。怎么等待呢?执行一段无意义是循环即可。
3、轻量级锁:目的:为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路劲。当关闭偏向锁功能或者多个线程竞争偏向锁导致偏向锁升级为轻量级锁,则会尝试获取轻量级锁
4、重量级锁:通过对象内部的监视器实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高。

4、锁升级的目的:是为了减低锁带来的性能消耗。在JDK1.6之后优化synchronized的实现方式,使用了偏向锁升级为轻量锁在升级到重量锁的方式,从而降低了锁带来的性能消耗

5、synchronized和lock的区别
1、实现层面:synchronized(JVM层面)、lock(JDK层面)
2、响应中断:lock可以让等待锁的线程响应中断,而使用synchronized时,等待的线程会一直等待下去,不能够响应中断
3、立即返回:可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间。而synchronized却无法办到
4、读写锁:lock可以提高多个线程进行读操作的效率
5、可以实现公平锁:lock可以实现公平锁,而synchronized天生就是非公平锁
6、synchronized在执行完相应的代码块后,会自动释放锁,而lock需要手动启动,手动释放

6、实现线程池:主要有两部分组成,多个工作线程和一个阻塞队列。其中工作线程是一组已近处在运行中的线程,它们不断地向阻塞队列中领取任务执行。而阻塞队列用于存储工作线程来不及处理的任务。

7、运行机制:当有请求到来时
1、若当前实际线程数量少于corePoolSize(基本线程数量),即使有空线程,也会创建一个新的工作线程
2、若当前实际线程数量处于corePoolSize和maximumpoolsize(最大线程数量),并且阻塞队列没满,则任务将被放入阻塞队列中等待执行
3、若当前实际线程数量小于maximumpoolsize,但是阻塞队列已满,则直接创建新线程处理任务
4、若当前实际线程数量已经达到maximumpoolsize,并且阻塞队列已满,则使用饱和策略

8、java并发类库提供的线程池有几种?分别有什么特点?5种
1、newCachedThreadPool:用来处理大量短时间工作任务的线程池。当无缓存线程可用,就会创建新的工作线程;如果线程闲置的时间超过60秒,则被终止并移除缓存;其内部使用synchronousQueue作为工作队列
2、newFixedThreadPool(int nThreads),重用指定数目的线程,其背后使用的是无界的工作队列,任何时候最多有nThread个工作线程是活动的。
3、newSingleThreadExecutor()和newScheduledThreadPool(int corePoolSize),创建的是多个ScheduleExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程
4、newSingleThreadExecutor(),它的特点在于工作线程数目被限制为1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态
5、newWorkStealingPool(int parallelism),java8才加入这个创建方法,并行的处理任务,不保证出路顺序
6、ThreadPoolExecutor():是最原始的线程池创建,上面1、2、4、创建方式都是对ThreadPoolExecutor的封装。

原文链接:https://blog.csdn.net/Butterfly_resting/article/details/89668402