并发面试题
- 线程
操作系统能够运算调度的最小单位 被包含在进程当中 进程运行的实际最小单位 - 进程与线程之间不同
线程是进程的子集 不同的进程使用不同的内存空间 但是所有的线程共享一片相同的内存空间(堆) - 线程的几种状态?
新建状态:new
就绪状态:start返回时处于就绪状态 不一定立马执行run 可能需要竞争CPU
运行状态:获得CPU 执行run
阻塞状态:线程没有运行结束 暂时让出CPU
死亡状态:run方法正常退出;异常 - Runnable还是Thread
如果需要继承其他类 还是用Runnable - Thread中start和run的区别
start 内部调用了run 但是会有新线程的启动 run没有新线程的启动 - Runnable和Callable的区别
Callable的call方法可以返回值(装载有Future的对象)和抛出异常 - Java内存模型
如果两个操作之间不遵循Happens-Before 那么JVM可以做任意的重排序(一般会做指令优化重排) 多线程的情况下 如果不依照Happens-Before排序就会产生数据竞争问题 此时需要正确的同步- Volatile
只有成员变量才能使用 禁止指令重排可以保证下一个读取操作可以在上一个写操作之后完成(保证了一定的有序性)
- Volatile
- 什么是线程安全
多个线程访问同一个类时 这个类都能表现正确的行为 - 什么是竞态条件
当一个运行结果取决于多线程交替运行时序 就会产生竞态条件
最常见的类型是 先检查后执行 即通过一个可能失效的结果决定下一步的操作
无序处理 - 如何停止一个线程
线程运行完会自动退出
Volatile布尔变量取消任务中断线程? - 线程发生异常
异常没被捕获 线程会停止执行 Thread.UncaughtExceptionHandler处理 - 两个线程共享数据
共享对象 阻塞队列这种并发的数据结构 ? - notify notifyall区别
Notify在只有一个线程等待的时候才有用
notifyall 唤醒所有的线程并且允许它们争夺锁 确保至少有一个线程是活着的 - wait notify这些方法不定义在Thread中
Java提供的锁是对象级的而不是线程级的 对象锁能够明显的知道线程在等待哪个锁 - ThreadLocal
ThreadLocal是保证线程安全的一种高效的办法(空间换时间) 保存着线程以及其私有变量内存副本拷贝的映射关系
怎么使得SimpleDateFormat变成线程安全的?
ThreadLocalRandom的实现原理? - FutureTask
一个可以取消的异步运算 只有当运算完成的时候结果才能取回 否则get方法会阻塞 使用实例? - Wait notify为什么需要在同步块中?
API的要求 为了防止产生竞态条件 - 同步集合和并发集合的区别
并发集合的可扩展性更高 比如像并发集合ConcurrentHashMap 不仅提供了线程安全 还有锁分离 内部分区 - 堆和栈 区别
栈是线程私有的 堆是线程共享的
对象实例存在堆中 线程为了提高效率会弄一个缓存到自己的栈(工作内存) 多线程下就会出现问题 volatitle就可以发挥作用 它要求线程从主存(堆)读取变量的值
堆和栈道效率? - 线程池
管理一组工作线程的资源池
三个好处:1⃣️ 线程复用 2⃣️ 提前创建线程提高响应性 3⃣️ 适当的调整线程池的大小 能够避免多个线程抢占内存耗尽内存 - 如何解决生产者消费者问题
BlockingQueue? - 避免死锁
死锁是指争夺资源互相等待 避免死锁的方法:阻止循环等待条件 将资源设置标志位并且排序 规定每个进程申请资源都必须按照一定的顺序 - 死锁 活锁的区别
活锁的线程状态是不断的改变的 两个人同时给对方让路 但是因为避让的方向一致 导致不能继续执行 - 怎么检测线程是否拥有锁
Thread&holdsLock - synchronized和ReentrantLock的不同
ReetrantLock弥补了synchronized的局限性 :无法中断正在等待的线程;无法无限的等待锁
具有synchronized相同的互斥性和可见性
但是很危险 它无法像synchronized自动清除锁 需要在finally中释放锁 项目中的应用? - 三个线程T1 T2 T3 怎么确保按顺序执行?
使用join方法 在一个线程中启动另外一个线程 T3启动T2 T2启动T1 - yield作用
暂停正在执行的线程对象 让其他具有相同优先级的线程执行 并且放弃CPU 可能进入到暂停状态马上又执行
和sleep的区别?
Sleep不考虑线程的优先级;sleep转入阻塞状态不会立马执行 - ConcurrentHashMap的并发度是什么
把实际的map划分成若干部分来实现可扩展性和线程安全 划分依据并发度 默认为16? - 提交任务时队列已满会发生什么?
RejectedExecutionException - 线程池的submit和execute的区别
都是向线程池提交任务 execute返回类型时void submit返回类型时有计算结果的Futrue对象 - ReadWriteLock是什么?
提升并发性能的锁分离技术 维护一对关联锁 一个只读一个只写 没有写线程的情况下 一个读锁可能被多个读线程持有 写锁是独占的 ReentrantReadWriteLock来实现这个规则 - 同步块内线程抛出异常会发生什么?
会释放锁 - 创建线程安全的单例
枚举
网友评论