并发编程优缺点
并发编程优点
并发编程缺点
上下文切换、线程安全、死锁、内存泄漏
并发编程三要素
1、原子性
2、可见性
3、有序性
什么是死锁、死锁的四个必要条件
如何避免死锁
创建线程的四种方式
创建线程的四种方式
1、继承Thread类
2、实现 Runable 接口
3、实现 Callable 接口
4、使用 Executors 工具类创建线程池
线程的run()和start()有什么区别?
调用start方法方可启动线程,并使线程进入就绪状态,而run方法只是thread的一个普通方法调用,还是在主线程中执行
什么是Callable和Future?
Future表示一个异步任务的结果
什么是FutureTask?
FutureTask表示一个异步运算的任务,其构造方法中可以传一个callable的具体实现类,可以对这个异步运算任务的结果进行等待获取,判断是否已经完成,取消等操作。
线程状态和基本操作
线程的五种基本状态
Java中用到的线程调度算法是什么?
1、分时调度模型
2、抢占式调度模型
线程的调度策略
线程调度器选择优先级最高的线程运行,但是发生以下情况会终止线程的运行
请说出与线程同步以及线程调度相关的方法
wait()
sleep()
notify()
notifyAll()
sleep()和wait()方法的区别
为什么wait()、notify()、notifyAll()被定义在object中?
需要在对象锁上调用wait、notify方法,在java中任何一个对象都可以作为锁,所有对象都继承于Object,所以wait()、notify()、notifyAll()需要定义在Object中
为什么wait()、notify()、notifyAll()必须在同步方法或者同步块中被调用
当一个线程需要调用对象的wait()方法的时候,这个线程必须用拥有该对象的锁
Thread中的yield方法有什么作用?
使当前线程从运行状态变为就绪状态,其他线程获取到cpu的时间片
为什么Thread的sleep()和yield()方法是静态的?
Thread类的sleep和yield方法是在当前正在执行的线程上运行
线程sleep方法和yield方法有什么区别?
Java中interrupt,interrupted和isInterrupted方法的区别?
notify()和notifyAll()有什么区别?
什么是线程同步和线程互斥,有哪几种实现方式?
Monitor实现线程同步的过程
如果你在提交任务时,线程池队列已满,这时会发生什么?
什么是线程安全? servlet是线程安全吗?
在Java中如何保证多线程的运行安全?
你对线程优先级的理解是什么?
11111111111111111111111111111111111111111111111111111111111111111111
线程类的构造方法,静态快是被哪个线程调用的?
线程类的构造方法、静态块是被new 这个线程的线程所调用的。而run方法里面的代码才是线程自身调用的
java中怎么获取一份线程的dump文件?你如何在java中获取线程堆栈?
线程运行时发生异常会怎样?
如果异常没有被捕获,则该线程会停止运行
并发理论
重排序与数据依赖性
为什么代码会重排序
Java中的代码重排序是指Java编译器、JIT编译器或处理器为了提高代码执行效率而对代码的执行顺序进行优化调整的过程。重排序过程可能会改变代码执行的顺序,但不会改变代码的结果
并发关键字
synchronized的作用
说说自己怎么使用synchronized关键字,在项目中用到了吗?
说一下synchronized的底层实现原理
什么是自旋?
多线程中synchronized锁升级的原理是什么?
线程B怎么知道线程A修改了变量?
synchronized,volatile,CAS比较
synchronized和lock的区别?
synchronized和ReentrantLock的区别
synchronized是关键字,ReetrantLock是类
相同:
synchronized和ReentrantLock都是可重入锁
区别:
ReentrantLock必须手动获取和释放锁,而synchronized不需要手动开启和释放锁
synchronized只能适用于代码块锁,synchronized可以修饰类,方法,变量
volatile
volatile关键字的作用
java提供了volatile关键字来保证可见性和禁止指令重排
java中可以创建volatile数组吗?
volatile能是一个非原子操作变成原子操作吗?
关键字volatile的作用是使共享变量在多个线程间可见,但是无法保证原子性,对于多线程访问共享变量需要加锁进行同步
volatile修饰符有什么实践?
单例模式
final
什么是不可变对象,它对写并发有什么帮助?
不可变对象即对象一旦被创建,它的状态(对象的属性)就不能改变,反之称为可变对象
Lock体系
Lock接口是什么? 对比同步它有什么优势?
乐观锁和悲观锁的理解,以及如何实现?
什么是CAS?
CAS会产生什么问题?
什么是死锁?
产生死锁的条件?如何预防死锁?
描述下锁的升级原理是什么?
AQS详解与源码分析
什么是AQS?
AQS原理?
AQS对资源的共享方式
AQS底层使用了模板方法模式
ReentrantLock(重入锁)实现原理与公平锁非公平锁区别
什么是可重入锁?
读写锁ReentrantReadWriteLock是什么源码分析
Condition源码分析与等待通知机制
LockSupport详解
== ------------------------------------------分割线 --------------------------------------------------------------------------==
并发容器
什么ConcurrentHashMap?
ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现
Java中ConcurrentHashMap的并发度是什么?
什么是同步容器,什么是并发容器
同步容器:简单理解为通过synchronized来实现同步的容器,如果多个线程调用容器的方法,会使用加锁的方式实现同步。比如 vector,hashtable
并发容器:使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性
SynchronizedMap和ConcurrentHashMap的区别?
并发容器 CopyOnWriteArrayList
并发容器之 Thread 详解
ThreadLocal是什么?有哪些使用场景
什么是线程局部变量
ThreadLocal内存泄漏的原因?
TheadLocal的内存泄漏解决方案
并发容器之BlockingQueue详解
线程池
什么是线程池?有哪几种创建方式?
线程池的优点
降低资源消耗:重用存在的线程,减少对象创建销毁的开销
线程池都有哪些状态?
什么是Executor框架?为什么使用Executor框架?
Executor框架是一个根据一组执行策略调用,调度,执行和控制异步任务的框架
线程池之ThreadPoolExecutor详解
Executor和ThreadPoolExecutor创建线程池的区别?
你知道如何创建线程池吗?
使用ThreadPoolExecutor
ThreadPoolExecutor构造函数重要参数分析