http和https有那些区别
http是超文本传输协议,信息是明文传输,存在安全风险的问题,https则解决http不安全的缺点,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输
http连接建立相对简单,tcp三次握手之后便可进行http的报文传输,而https在tcp三次握手之后,还需进行ssl/tls的握手过程,才可进入加密报文传输
sleep()和wait()方法对比
sleep方法没有释放锁,而wait方法释放锁,wait()通常被用于线程间交互/通信 sleep()通常被用于暂停执行
wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify或者notifyAll
那些对象可以作为GC Root?
虚拟机栈中引用的对象
public static void main(String []args){Demo demo=new Demo();demo=null;
}
方法区中类静态属性引用的对象
public static Demo a;
public static void main(String[]args){Demo b=new Demo();b.a=new Demo();b=null;}
方法区中常量引用的对象
public static final Demo a=new Demo();
public static void main(String[]args){Demo demo=new Demo();demo=null;
}
本地方法栈中JNI(native方法)引用的对象
如何实现可重入锁
synchronized的可重入性通过JVM内部机制实现,具体来说,每个锁对象都有一个计数器来记录当前持有该锁的线程重入的次数。
当一个线程首次获取锁,计数器加1,如果同一个线程再次获取锁,计数器1再次加1,这就是所谓的重入,每次线程释放锁,计数器会减一,只有当计数器减为0时,锁才会释放
OSI模型
应用层:负责给应用程序提供统一的接口
表示层:负责把数据转换成兼容另一个系统的能够识别的格式
会话层:负责建立,管理,终止表示层实体之间的通信方式
传输层:负责端到端的数据传输
网络层:负责数据的路由,转发,分片
数据链路层:负责数据的封帧和差错检测 ,以及Mac寻址
物理层:负责在物理网络中传输bit流
Read View在MVCC工作模式
m_ids:指的是在创建Read View 时,当前数据库中活跃事务的事务id列表,
JDK动态代理和CGLib代理区别
JDK动态代理是基于接口的代理,只能代理实现了接口的类
CGLIB动态代理是基于继承的代理,可以代理没有实现接口的类,使用CGLib动态代理时,Spring AOP会生成目标类的子类,并在方法调用前后插入横切逻辑
String 适用于少量的数据
StringBuilder: 单线程操作字符串缓冲区下操作大量数据
StringBuffer:多线程操作字符串缓冲区下操作大量数据
深拷贝和浅拷贝
浅拷贝:只复制对象本身和其内部的值类型字段,但不会复制对象内部的引用类型字段,浅拷贝只是创建一个新的对象,然后将源对象的字段值复制到新对象中,但如果源对象内部有引用类型字段,只是将引用复制到新对象中,两个对象指向同一个引用对象
深拷贝:指在复制对象的同时,将对象内部的所有引用类型字段的内容也复制一份,而不是共享引用,深拷贝会递归复制对象内部所有引用类型的字段,生成一个全新的对象以及其内部的所有对象
BIO 同步阻塞 应用程序发起read调用后,会一直阻塞,直到内核把数据拷贝到用户空间
NIO 同步非阻塞IO模型中,应用程序会一直发起read调用,等待数据从内核空间拷贝到用户空间的这段时间里,应用程序不断进行I/O系统调用轮询数据是否已经准备好的过程的十分消耗CPU资源
IO多路复用模型:线程首先发起select调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程read再发起read调用,read调用的过程(数据从内核空间->用户空间)还是阻塞的
选择器selector 多路复用器,通过它,只需要一个线程便可以管理多个客户端连接,当客户端数据到了之后,才会为其服务。
JVM内存模型里的堆和栈有什么区别
栈主要用于存储局部变量,方法调用的参数,方法返回地址以及一些临时数据。每当一个被调用,一个栈帧就会在栈中创建,用于存储该方法的信息,当方法执行完毕后,栈帧也会被移除,堆用于存储对象的实例,当你使用new关键字创建一个对象时,对象的实例就会在堆上分配空间
生命周期:栈中的数据具有确定的生命周期,当一个方法调用结束时,其对应的栈帧就会被销毁,栈中存储的局部变量也会随之消失,堆中的对象生命周期不确定,对象会在垃圾回收机制检测到对象不再被引用时才被回收
存取速度:栈的存取速度比堆快,因为栈遵循先进后出的原则,操作快速简单,堆的存取速度相对较慢
存储空间:栈的空间相对较小,且固定,由操作系统管理,当栈溢出时,通常是因为递归过深或局部变量过大。堆的空间较大,动态扩展,由JVM管理。堆溢出通常是由于创建了太多的大对象或未能及时回收不再使用的对象
可见性:栈中的数据对线程是私有的,每个线程有自己的栈空间,堆中的数据对线程是共享的,所有线程都可以访问堆上的对象
抽象类和接口区别
实现方式:实现接口的关键字为implements ,继承抽象类的关键字extends,一个类可以实现多个接口,但一个类只能继承一个抽象类,所以接口可以间接实现多重继承
方法方式:接口只有定义,不能有方法的实现,抽象类可以有定义与实现,方法可在抽象类中实现
变量:抽象类可以包含实例变量和静态变量,而接口只能包含常量
访问修饰符:接口成员变量默认为public static final 必须赋初值,不能被修改 抽象类中成员变量默认为default,可在子类中重新定义,也可被重新赋值