58

1.JDK动态代理实现原理 可手写或者简述

1、InvocationHandler
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable
1
我们看到这个方法一共接受三个参数,那么这三个参数分别代表如下:

proxy:  指代JDK动态生成的最终代理对象
method: 指代的是我们所要调用真实对象的某个方法的Method对象
args:   指代的是调用真实对象某个方法时接受的参数
2、Proxy
Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
这个方法的作用就是得到一个动态的代理对象,其接收三个参数,我们来看看这三个参数所代表的含义:

loader:  一个ClassLoader对象,定义了由哪个ClassLoader来对生成的代理对象进行加载
interfaces:  一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
其实我们所说的DynamicProxy(动态代理类)是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。如此一来,我们可以把该class的实例当作这些interface中的任何一个来用(可以强转为相应的接口类型)。当然,这个DynamicProxy其实就是一个Proxy,它不会做实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

https://blog.csdn.net/xiaokang123456kao/article/details/77679848

2.多线程的在Java中CycliBarriar和CountdownLatch有什么区别

3.AOP和IOC项目中的应用,及AOP的切面实现原理

https://www.cnblogs.com/liuruowang/p/5711563.html

4.服务CPU高怎么排查,及常用排查命令及作用

1.top 查看哪个进程占用CPU多

2.查看此进程下的所有的线程情况

 ps -mp 18257 -o THREAD,tid,time

3.查看该线程的堆栈情况,先将线程id转为16进制,使用printf “%x ” tid命令进行转换,因为线程堆栈情况记录的是线程的16进制id

printf "%x "  18357

4.然后根据该id通过命令 jstack pid |grep tid -A 30(pid:进程id,tid:线程id)

5.查看磁盘命令 df -h

6.通过命令du -sh *查看具体文件夹占用内存情况

https://blog.csdn.net/lonyness/article/details/82628988

5.高并发下redis缓存穿透问题解决方案

6.堆和栈的区别

     1.栈内存存储的是局部变量而堆内存存储的是实体;

            2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

            3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

7.手写工厂模式和单例模式

8.线程池实现原理

 https://www.cnblogs.com/dongguacai/p/6030187.html

线程池的优点

1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。

2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。

线程池的创建

1 public ThreadPoolExecutor(int corePoolSize,
2                               int maximumPoolSize,
3                               long keepAliveTime,
4                               TimeUnit unit,
5                               BlockingQueue<Runnable> workQueue,
6                               RejectedExecutionHandler handler) 

corePoolSize:线程池核心线程数量

maximumPoolSize:线程池最大线程数量

keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间

unit:存活时间的单位

workQueue:存放任务的队列

handler:超出线程范围和队列容量的任务的处理程序

提交一个任务到线程池中,线程池的处理流程如下:

1、判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。

2、线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。

3、判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

9.CAS算法原理

https://www.cnblogs.com/jianzh5/p/6671230.html

原文地址:https://www.cnblogs.com/lvgg/p/10402429.html