先看原题,自己心里默想一遍答案再滑到后面对比答案。答案来源于网络,欢迎指正,共同进步
一、原题
1、自我介绍
2、equals与==
3、Integer之间==
4、Integer如何放到常量池
5、volatile说一说
6、可见性有什么作用。
7、如果java内存模型中去掉了线程内存,直接修改主内存会出现什么情况。
8、单例模式说一说
9、枚举是如何防止反射破坏单例模式的
10、动态代理模式说一说
11、JDK和cglib动态代理区别
12、CAS说一说
13、TCP三次握手?两次握手行不行,为什么?
14、滑动窗口
------------------------------------------------------------------------优美的分割线------------------------------------------------------------------------
二、答案
1、自我介绍
2、equals与==
== 的作用
基本类型:比较值是否相同
引用类型:比较地址值是否相同
equals 的作用
引用类型:默认情况下,比较的是地址值;不过,我们可以根据情况自己重写该方法。比较对象的成员变量值是否相同。
3、Integer之间==
当我们比较包装类的时候,如果范围在【-128,127】之间,可以直接用==比较,超出这个范围要用equals,进行比较。
4、Integer如何放到常量池
Integer类在加载时,将会直接缓存-128~127之间数值的所有Integer类实例对象,存放在常量池中;
所以我们就清楚了,如果实参的值在-128~127之间,我们调用ValueOf方法时,它就从缓存中直接返回实例。此时我们使用==比较地址值,当然就会返回true。
5、volatile说一说
volatile是jvm提供的轻量级的同步机制
主要有三个特性:
可见性
不保证原子性
禁止指令重排
6、可见性有什么作用。
保证线程的可见性。
当共享变量发生改变时,其它线程可见。
7、如果java内存模型中去掉了线程内存,直接修改主内存会出现什么情况。
盲猜一波,欢迎指正
等同于直接读写主内存,不用考虑可见性,但是因为没做多线程处理,会导致脏读写问题。
8、单例模式说一说
单例模式,见名知意就是只生成一个实例。
六种实现方法
懒汉式(线程不安全)
懒汉式(线程安全)
饿汉式(线程安全)
双检锁/双重校验锁(线程安全)
登记式/静态内部类(线程安全)
枚举(线程安全)
一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。只有在要明确实现 lazy loading 效果时,才会使用第 5 种登记方式。如果涉及到反序列化创建对象时,可以尝试使用第 6 种枚举方式。如果有其他特殊的需求,可以考虑使用第 4 种双检锁方式。
9、枚举是如何防止反射破坏单例模式的
反编译后的类可以看到:
类的修饰abstract,所以没法实例化,反射也无能为力。
10、动态代理模式说一说
代理:顾名思义就是代为处理,换句话讲就是自己的事情自己不做让别人代替自己做。
通过java的反射机制实现对被代理对象的前置与后置增强操作
例如:aop
11、JDK和cglib动态代理区别
一、原理区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
二、JDK动态代理和CGLIB字节码生成的区别?
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
12、CAS说一说
compare and swap (比较并交换)
是一种高效实现线程安全的方法
1、支持原子更新操作,适用于计数器,序列发生器(就是给变量自增的工具)等场景
2、属于乐观锁机制,号称lock-free(底层也是有加锁行为的)
3、CAS操作失败是,由开发者决定是否继续尝试,还是其他操作,因此争用CAS失败的线程不会被阻塞挂起
缺点:
1、cpu开销大
2、不能保证代码块的原子性
3、会引发ABA问题
13、TCP三次握手?两次握手行不行,为什么?
发起方(A):“你好,请问我可以跟你建立一个连接吗?”(发送请求,等待回复)
接收方(B):“好啊,我准备好了,来吧。”
发起方(A):“好的,谢谢,我现在开始向你发送数据了。”
两次握手不行,三次握手是为了防止当已失效的连接请求报文段突然又传到服务端,造成双方的不一致,导致资源的浪费。
14、TCP滑动窗口
属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输,提高网络吞吐量。