阿里-面经2

protected和default的区别?

      protected:包内所有类可见,包外有继承关系的子类可见

      default:包内所有类可见,包外有继承关系的子类不可见

值传递和引用传递,String和char作为参数,结果会改变吗?

   值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中的参数值不改变实际参数值的值

  引用传递:也称作地址传递,方法调用时,传入的是参数的地址,方法执行中会改变实际参数

   string不会改变,char会改变,string是final char[]的,所以作为形参不会改变值

异常有几大类?运行时的空指针会抛出异常吗?IO Exception异常发生需要自己去捕获吗?

    两大类,编译时异常和运行时异常。运行的空指针不会抛出异常,IO Exception的异常需要自己捕获,不捕获程序都会出错

线程池的ThreadPoolExecutor核心参数,什么时候创建线程,什么时候不创建,线程达到最大上限后执行的策略,什么时候加入工作队列?

      核心参数:核心线程数,工作队列,最大线程池数量,拒绝策略。

      当核心线程池没满的时候,每来一个任务就会创建一个核心线程,核心线程池满了的话,那么就会进入工作队列,这个时候不创建线程,假如工作队列也满了,那么就会在线程池中创建线程,假如达到了最大线程数,那么就会调用拒绝策略

线程的状态?什么时候进入阻塞状态?什么时候进入等待状态?wait之后的状态可以直接回到Runnable吗?

     创建,就绪,运行,阻塞,等待,死亡

    当调用了sleep方法,或者调用阻塞式IO,或者调用一个锁对象,但是该锁此刻被其他对象占有,或者正在等待某个通知时会进入阻塞状态

    不能,必须等到别人的notify或者notifyAll方法

高并发会带来什么问题?死锁的解决方法?

     并发请求过得直接是数据库或者网页崩掉。

    解决方法:定义锁的顺序,整个过程都按照顺序来获取锁。给锁设置超时时间,进行死锁检测,尽量避免同一个线程多次获得锁

synchronized的用法有哪些?一个类中有两个synchronized方法被两个线程锁住,分别调用会阻塞吗?

     加在方法上,加在代码块内,加载静态方法或类上。

     会阻塞,因为本质上都是锁住的该对象,所以同一时刻只能有一个线程访问到同步方法

说说ReentrantLock和synchronized的区别,还有CAS?

      ReentrantLock也是一种同步锁,不过支持显示的获取和释放锁,并且支持可中断的,超时的获取锁,还能设置公平性与非公平性。CAS是一种著名的无锁算法,通过非阻塞的方式实现了变量在多个线程之间的同步,首先会获取内存值,然后还会有一个期待值和更改值,假如内存值和期待值相同,那么就更改内存值为更改值,否则进入自旋。不过CAS还有ABA和自旋浪费cpu性能的问题

设计模式知道哪些?设计原则有哪些?单例模式的构造函数的特点?双重校验锁为什么加上volatile?

     单例模式,工厂模式,代理模式

    单一职责原则,开闭原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特法则

    构造函数是private的

    因为volatile禁止了指令重排序,这样就可以保证双重校验锁的过程不会因为指令重排序的原因导致一个类没有被初始化就被别人拿去用而导致错误了

Spring的Ioc和Aop,ioc自动注入的注解,@Autowired的功能?

      ioc就是依赖注入,即将对代码的控制权交给了spring容器,让spring容器负责bean的实例化,依赖配置等等

      Aop即面向切面,是面向对象的一种补充,将直接与业务无关但是对各个模块都产生影响的公共行为和逻辑抽取出来并封装成一个可重用的模块,实现方式主要是静态代理和动态代理

     自动注入的注解是@Autowired

    功能是可以更精确地控制应该在何处以及如何进行自动装配

静态变量线程安全吗?

    不是线程安全的,静态变量位于方法区,被所有线程共享,一旦静态变量修改,其他线程对都可以发现该修改,所以不是线程安全的

什么是线程阻塞?等待阻塞和锁阻塞的区别?

    在某一时刻某一个线程在运行一段代码的时候,这个时候另一个线程也需要运行,那么另一个线程是无法运行这段代码的,这就是线程阻塞

   等待阻塞是一个线程等待另一个线程的通知调度,是主动的,而锁阻塞是争夺锁没有争夺到,是被动的阻塞

用过innoDB吗?优势是什么?

   用过,InnoDB有多种锁,比如表级锁,行级锁;InnoDB支持事务和外键

一张表有大量的访问请求怎么办?

   可以进行缓存,把数据缓存到redis中,还可以用上消息队列进行削峰

Http协议了解吗?cookie的传输过程,cookie失效?

    http即超文本传输协议,基于tcp/ip通信协议来传输数据,是一个属于应用层的面向对象的协议,是一个无连接无状态的协议

   当浏览器访问服务端时,服务器会向浏览器返回一个cookie,浏览器将该cookie保存,下次在发送相同的请求时,服务器会检测cookie和用户的状态。cookie是利用网页的http头信息进行传递的。

   cookie是存储在客户端的,如果不定义过期时间,则过期时间是整个会话期,并且不仅要设置过期时间,还要重新去访问服务端,服务器给cookie发一个新的cookie时原来的cookie才真正的失效

单例模式在高并发情况下需要加synchronized锁吗?

    看情况,单例模式和加不加锁没有必然关系,单例模式只是保证只存在一个实例就行,而加锁是为了某个方法在某一个时间内只能被一个人使用,主要看自己的方法需不需要同步

自己设计一个消息中间件该怎么办?

     为了mq的可伸缩性即吞吐量和容量,设计成分布式系统,然后设置成支持消息持久化的,即mq里面的数据要持久化到磁盘里,还要设置成集群的保持高可用

HashMap和TreepMap?

     HashMap和TreeMap都是非线程安全的。hashMap中通过hashcode对内容进行快速查找,TreeMap中所有的元素都保持着固定的顺序,如果想要得到一个有序的结果可以采用TreeMap。HashMap基于哈希表实现,TreeMap基于红黑树实现的。HashMap适用插入和删除,TreepMap适用于自然顺序或自定义顺序遍历key,总体上HashMap更快一些,如果要排序再用TreepMap(因为TreeMap需要维护平衡)

  通过Collections.SynchronizedMap()来进行包装,或者直接用concurrentHashMap来使hashMap线程安全

Ioc的流程?

    1)创建ioc配置文件的抽象资源

    2)创建一个BeanFactory

   3) 把读取配置新的BeanDefinitionReader配置给BeanFactory

   4)读取配置信息,然后完成整个载入bean定义的过程

注解的原理?

   注解的底层是使用反射来实现的,首先是两个元注解:@Target和@Retention

类加载的流程?

    加载,验证,准备,解析,初始化,使用,卸载

什么时候出发Full GC?

     当老年代中没有足够多的内存空间来存储新的对象时触发

空间分配担保失败机制?

     1.准备在新生代进行minor GC时会首先检查老年代的最大连续空间区域的大小是否大于新生代所有对象的大小

     2.如果老年代能装下所有新生代对象,那么minor GC没有风险就会进行minor GC

    3.如果老年代无法装下,垃圾收集器会进行一次预测:根据以往minor GC过后存活对象的平均数来预测这次minor GC后存活对象的平均数

堆和栈的区别?

    所有对象的空间分配都是在堆上进行的,堆随着jvm的启动创建,随着jvm的关闭而销毁,栈里面存储是局部变量,栈是随着线程的创建而创建,随着线程的销毁而销毁的,并且垃圾回收不需要在栈上进行

Callable和Runnable的区别?

   相同点是两者都是接口,都需要调用thread.start方法启动线程

  不同点是callable允许返回值,而Runnable没有返回值,callable可以抛出异常,Runnable不能抛出异常,callable和Runnable都可以应用于executors。但是thread类只支持Runnable

反射的原理?

   首先通过class.forName()获取到类的实例,然后获取到ClassLoader,再调用native方法获取信息,然后通过ClassLoader回调来加载该类,最后,jvm又会用ClassLoader进行进行类加载

redis和zk分布式锁的对比?

  1.redis分布式锁需要自己去不断尝试获取锁,比较消耗性能

  2.zk分布式锁获取不到锁注册个监听器就行了 ,不需要主动尝试获取锁,性能开销小

  3.如果redis'获取锁的客户端bug或者挂了,只能等超时时间后释放锁,而zk因为创建的是临时节点,只要客户端挂了,znode就没了,自动释放锁

  4.redis分布式锁比较麻烦,zo分布式锁语义清晰实现简单

redis的原理?

    redis是在内存中进行操作的并且用到了多路复用,所以速度非常快,性能很高,并且由于是单进程的,所以没有线程上下文切换的开销。它的持久化主要有两种方式,一种是快照持久化,一种是AOf持久化

   多路复用:由于redis是跑在单线程中的,但是读写操作等待用户输入输出都是阻塞的,所以就用到了多路复用。多路复用就是在单个线程中通过记录跟踪每一个IO流的状态来管理多个IO流

redis的一致性哈希

    一致性哈希是分布式系统中的常用算法,解决了普通余数hash算法伸缩性差的问题,可以保证在上线,下线服务器的情况下尽量多的请求命中原来路由到的服务器。

    那么一致性哈希怎么实现呢?

               1)将内存想象成一个环,由于hash有32位,因此能够分出2^32个地址

                2)用节点的ip+算法确定唯一的哈希值,之后在内存中确定节点的位置

                3)保存数据时,根据key进行哈希运算,确定唯一的一个位置

                 4)根据当前key位置顺时针查找最近的node节点进行挂载

ZooKeeper的通信原理?

       watch事件

说说ArrayBlockingQueue?

           是一个用数组实现的有界阻塞队列,该队列按照先进先出的原则对元素进行排序。支持公平锁和非公平锁。常用方法是add,clear,contains,iterators,offer

说说jvm的内存结构?

        方法区,堆,本地方法栈,虚拟机栈,程序计数器

对象在内存中的变化过程,什么时候从堆到其他区?

    1.对象主要放在堆内存中,方法和属性主要放在栈内存中

    2.栈是运行时单位,用来解决程序运行时的问题,堆是存储单位,解决数据存储的问题

    3.堆伴随着jvm的启动创建

  

  

发布了208 篇原创文章 · 获赞 0 · 访问量 5974

猜你喜欢

转载自blog.csdn.net/qq_40058686/article/details/104621025