/ Java / 17浏览

Java 面试题

Synchronized和Lock的实现原理与区别

相同点:

  1. 都是可重入锁
  2. 都保证了可见性和互斥性
  3. 都可以用于控制多线程对共享对象的访问

不同点:

  1. ReentrantLock等待可中断
  2. synchronized中的锁是非公平的,ReentrantLock默认也是非公平的,但是可以通过修改参数来实现公平锁。
  3. ReentrantLock绑定多个条件
  4. synchronized是Java中的关键字是JVM级别的锁,而ReentrantLock是一个Lock接口下的实现类,是API层面的锁。
  5. synchronized隐式获取锁和释放锁,ReentrantLock显示获取和释放锁,在使用时避免程序异常无法释放锁,需要在finally控制块中进行解锁操作。

Java线程池核心参数与工作流程,拒绝策略

线程池中的执行流程:
(1)当线程数小于核心线程数的时候,使用核心线程数。
(2)如果核心线程数小于线程数,就将多余的线程放入任务队列(阻塞队列)中
(3)当任务队列(阻塞队列)满的时候,就启动最大线程数.
(4)当最大线程数也达到后,就将启动拒绝策略。

四种拒绝策略

实现 RejectedExecutionHandler接口,重写void rejectedExecution(Runnable r, ThreadPoolExecutor executor)方法,实现拒绝策略,JDK内置了以下4种

1.ThreadPoolExecutor.AbortPolicy
线程池的默认拒绝策略为AbortPolicy,即丢弃任务并抛出RejectedExecutionException异常(即后面提交的请求不会放入队列也不会直接消费并抛出异常);

2.ThreadPoolExecutor.DiscardPolicy
丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃(也不会抛出任何异常,任务直接就丢弃了)。

3.ThreadPoolExecutor.DiscardOldestPolicy
丢弃队列最前面的任务,然后重新提交被拒绝的任务(丢弃掉了队列最前的任务,并不抛出异常,直接丢弃了)。

4.ThreadPoolExecutor.CallerRunsPolicy
由调用线程处理该任务(不会丢弃任务,最后所有的任务都执行了,并不会抛出异常)

TreeMap实现原理和数据结构 特点

java中有哪些锁

synchronized和可重入锁性能上有哪些差异 锁的粒度是什么样的 就是锁的范围有什么差异吗 可重入锁 有个分段的概念 分段锁