发表于: 2019-12-21 19:46:49
1 1163
今天做了什么:
收获:
代理模式:静态代理,编译时;动态代理,JVM运行中动态创建
适配器模式:SLF4J支持Log4J
单例模式,双重校验锁实现:
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() { }
public static Singleton getUniqueInstance() { //先判断对象是否已经实例过,没有实例化过才进入加锁代码
if (uniqueInstance == null) {
//类对象加锁 synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
volatile关键字: 可以禁止 JVM 的指令重排(指代码执行顺序改变)
==与equals;hashCode与equals:
==判断地址是否想等,即是否为同一对象
equals():1.若没覆盖equals()方法,等价于== 2.若覆盖,则比较内容是否相等
hashCode() 的作用是获取哈希码,也称为散列码 ;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置
对象相等>hashCode相同;hashCode相同,对象不一定相等
IO流:
4个抽象类基类:
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
既然有了字节流,为什么还要有字符流:
字符流是由 Java 虚拟机将字节转换得到的,这个过程还算是非常耗时, 并且,如果我们不知道编码类型就很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。
如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
BIO,NIO,AIO:
BIO(Blocking I/O):同步阻塞式I/O. 数据的读取写入必须阻塞在一个线程内等待其完成. 对于低负载、低并发的应用程序,可以使用.
NIO(New I/O): 同步非阻塞式I/O. 在一个线程中就可以调用多路复用接口(java中是select)阻塞同时监听来自多个客户端的IO请求.对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
AIO(Asynchronous I/O):也即NIO 2. 异步非阻塞的IO模型.
ThreadLocal
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。 ThreadLocal类主要解决的就是让每个线程绑定自己的值,存储每个线程的私有数据。
如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可以使用 get() 和 set() 方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。
Spring:
Spring事务隔离级别:
隔离级别从低到高:读未提交<读已提交<可重复读<串行化
- TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别, Oracle 默认采用的 READ_COMMITTED隔离级别.
- TransactionDefinition.ISOLATION_READ_UNCOMMITTED: (读未提交)最低的隔离级别,允许读未提交的数据变更,可能会导致脏读、幻读或不可重复读
- TransactionDefinition.ISOLATION_READ_COMMITTED: (读已提交)允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
- TransactionDefinition.ISOLATION_REPEATABLE_READ: (可重复读)对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
Spring事务传播行为:
支持当前事务的情况:
- TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)
不支持当前事务的情况:
- TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。
网络:
TCP与UDP协议:

UDP 在传送数据之前不需要先建立连接,远地主机在收到 UDP 报文后,不需要给出任何确认。虽然 UDP 不提供可靠交付,但在某些情况下 UDP 确是一种最有效的工作方式(一般用于即时通信),比如: QQ 语音、 QQ 视频 、直播等等
TCP 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。 TCP 不提供广播或多播服务。由于 TCP 要提供可靠的,面向连接的传输服务(TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源),这一难以避免增加了许多开销,如确认,流量控制,计时器以及连接管理等。这不仅使协议数据单元的首部增大很多,还要占用许多处理机资源。一般用于文件传输、发送和接收邮件、远程登录等场景。
问题:
明天计划:
继续看看面试题.
评论