JUC面试题
JUC面试题
并行和并发的区别?线程和进程的区别?
线程的有几种状态?线程的创建方式有哪几种?
线程池的有几种状态?线程池的创建方式有哪几种?
sleep()方法和wait()方法的区别
notify()和notifyAll()的区别
线程run()方法和start()方法的区别
为什么阿里巴巴规范不推荐用JDK自带的Executors创建线程池?那该这么创建线程池?
-- 通过ThreadPoolExcutor的构造方法指定参数
追问: 那么有哪几种参数?能不能讲讲线程池的工作原理?拒绝策略又有哪几种?拒绝策略使用场景?
- 怎么保证多线程的安全?
-- 原子性、可见性、有序性
你肯定想到了加锁,那么synchronized必考
sychronized在哪些地方使用?同步方法和同步代码块的区别?
sychronized和volatitle有什么区别?
sychronized锁有哪些状态?那么synchronized是什么锁?
什么是悲观锁? 什么是乐观锁?乐观锁通过什么实现? --CAS
说说什么是CAS?
能不能说说synchronized的底层原理?锁怎么优化?
ReentrantLock是什么锁?【可重入锁、乐观锁】
reetrantlock原理?
JUC解题
并发和并行,线程和进程
并发-->高并发-->火车抢票,商品抢购-->多个线程抢占同一资源
并行-->多事件同时发生【同一时刻】
线程-->程序执行、CPU调度的最小单位
进程-->一个进程有多个线程组成,比如QQ,谷歌浏览器等,各个进程相互独立
线程有几种状态?创建线程有几种方式?
NEW:新建状态
RUNNABLE:就绪状态
BLOCKED:阻塞状态
WAITING:等待状态
TIMED_WAITING:有限等待状态
TERMINATED:死亡状态
继承Thread类、实现Runnable接口作为对象、实现Callable接口使用FutureTask包装、使用线程池创建
线程池有几种状态?创建线程池有几种方式?
线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated
使用jdk自带的Executors工具类,可以创建
固定大小的线程池(newFixedThreadPool)、
单线程的线程池(newSingleThreadExecutor)、
可扩容的线程池(newCachedThreadPool())、
可定时的线程池(newScheduledThreadPool)
阿里巴巴规范推荐用什么创建线程池
ThreadPoolExcutor的构造方法指定参数
有7种参数,核心线程数、最大线程数、时间、时间单位、阻塞队列、创建线程工厂、拒绝策略
有4种拒绝策略,AbortPolicy(默认)抛出异常,CallerRunsPolicy将任务返回给调用者,DiscardOldestPolicy抛弃阻塞队列等待最久的任务,DiscardPolicy抛弃无法处理的任务
sychronized在哪些地方使用?
修饰代码块,修饰普通方法,修饰静态方法,修饰类
锁的几种状态?synchronized是什么锁
无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态
synchronized是可重入锁、悲观锁、重量级锁
什么是可重入锁? 可重复可递归调用的锁,外层加锁后内层仍然可使用,并且不会发生死锁
锁升级
在锁对象的对象头有个字段threadid默认为空,当第一次有线程访问时将threadid设为当前线程id,这就是偏向锁,当线程执行结束重新将threadid设为空,然后又有线程进入时,会判断threadid是否和当前线程id一样,一样就获取该对象否则就会发生锁升级,从偏向锁升级到轻量级锁,轻量级锁是通过自旋循环方式获取锁,如果执行一定次数没有获取到锁就会升级到重量级锁。通过这种锁升级就能减少性能损耗。
synchronized的底层原理?
synchronized支持的同步方法和同步语句都是使用monitor来实现的。每个对象都与一个monitor相关联,当一个线程执行到一个monitor监视下的代码块中的第一个指令时,该线程必须在引用的对象上获得一个锁,这个锁是monitor实现的。
ReentrantLock是什么锁?ReentrantLock的底层原理
可重入锁、乐观锁
通过CAS+AQS队列来实现,CAS就是比较并替换,仅当旧的预期值A和内存地址V的值相同时,才能将A修改为成修改值B,AQS是一个用于构建锁和同步容器的框架,使用一个FIFO的队列