拼多多电商部java高级社招面试题目分享(一)
1、并发编程三要素?
(1)原子性
原子性指的是一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要
么就全部都不执行。
(2)可见性
可见性指多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立
即看到修改的结果。
(3)有序性
有序性,即程序的执行顺序按照代码的先后顺序来执行。
2、实现可见性的方法有哪些?
synchronized或者Lock:保证同一个时刻只有一个线程获取锁执行代码,锁释放之前把最
新的值刷新到主内存,实现可见性。
3、多线程的价值?
4、创建线程的有哪些方式?
(1)继承Thread类创建线程类
(2)通过Runnable接口创建线程类
(3)通过Callable和Future创建线程
(4)通过线程池创建
5、创建线程的三种方式的对比?
6、线程的状态流转图
线程的生命周期及五种基本状态:
7、Java 线程具有五中基本状态
8、什么是线程池?有哪几种创建方式?
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处
理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源
的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。
java提供了一个java.util.concurrent.Executor接口的实现用于创建线程池。
9、四种线程池的创建:
(1)newCachedThreadPool创建一个可缓存线程池
(2)newFixedThreadPool创建一个定长线程池,可控制线程最大并发数。
(3)newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
(4)newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执
行任务。
10、线程池的优点?
(1)重用存在的线程,减少对象创建销毁的开销。
(2)可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
(3)提供定时执行、定期执行、单线程、并发数控制等功能。
11、常用的并发工具类有哪些?
(1)CountDownLatch
(2)CyclicBarrier
(3)Semaphore
(4)Exchanger
12、CyclicBarrier 和CountDownLatch 的区别
13、synchronized 的作用?
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制
synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以
加在方法上。
14、volatile 关键字的作用
对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰
时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。从实践角度而言,volatile的一个重要作用就是和CAS结合,保证了原子性,详细的
可以参见java.util.concurrent.atomic包下的类,比如AtomicInteger。
15、什么是CAS
16、CAS 的问题
17、什么是Future?
在并发编程中,我们经常用到非阻塞的模型,在之前的多线程的三种实现中,不管是继承
thread类还是实现runnable接口,都无法保证获取到之前的执行结果。通过实现Callback
接口,并用Future可以来接收多线程的执行结果。Future表示一个可能还没有完成的异步任务的结果,针对这个结果可以添加Callback以便
在任务执行成功或失败后作出相应的操作。
18、什么是AQS
AQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一
个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量
的同步器,比如我们提到的ReentrantLock,
Semaphore,其他的诸如ReentrantReadWriteLock,
SynchronousQueue,FutureTask等等皆是基于AQS的。
19、AQS 支持两种同步方式:
(1)独占式
(2)共享式
这样方便使用者实现不同类型的同步组件,独占式如ReentrantLock,共享式如Semaphore,
CountDownLatch,组合式的如ReentrantReadWriteLock。总之,AQS为使用提供了底层
支撑,如何组装实现,使用者可以自由发挥。
20、ReadWriteLock 是什么
21、FutureTask 是什么
这个其实前面有提到过,FutureTask表示一个异步运算的任务。FutureTask里面可以传入一
个Callable的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已
经完成、取消任务等操作。当然,由于FutureTask也是Runnable接口的实现类,所以
FutureTask也可以放入线程池中。
22、synchronized 和ReentrantLock 的区别synchronized是和if、else、for、
23、什么是乐观锁和悲观锁
24、线程B 怎么知道线程A 修改了变量
(1)volatile修饰变量
(2)synchronized修饰修改变量的方法
(3)wait/notify
(4)while轮询
#拼多多##面经##社招##java工程师#