• 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

  • 相关阅读:
    JDK10源码阅读--String
    [java大数据面试] 2018年4月百度面试经过+三面算法题:给定一个数组,求和为定值的所有组合.
    python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
    读取数据库信息并生成表设计文档Word版本
    怀念那时正规的软件开发流程
    eclipse安装java web插件
    webAPI+angularJS文件上传和下载
    .net整理
    怎么向老板解释你工作的价值?
    JS高级代码
  • 原文地址:https://www.cnblogs.com/lvgg/p/10402429.html
Copyright © 2020-2023  润新知