zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hadoop再次集群搭建(3)-如何选择相应的hadoop版本
    48. Rotate Image
    352. Data Stream as Disjoint Interval
    163. Missing Ranges
    228. Summary Ranges
    147. Insertion Sort List
    324. Wiggle Sort II
    215. Kth Largest Element in an Array
    快速排序
    280. Wiggle Sort
  • 原文地址:https://www.cnblogs.com/lvgg/p/10402429.html
Copyright © 2011-2022 走看看