Spike 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | 设计一个秒杀系统主要做到以下两点: 尽量将请求过滤在上游。 尽可能的利用缓存(大多数场景下都是查多于写)。 常用的系统分层结构: 针对于浏览器端,可以使用 JS 进行请求过滤,比如五秒钟之类只能点一次抢购按钮,五秒钟只能允许请求一次后端服务。(APP 同理) 这样其实就可以过滤掉大部分普通用户 ... 阅读全文 »
Synchronize 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | Synchronize 关键字原理众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前 Class 对象。 同步块,锁的是 {} 中的对象。 实现原理:JVM 是通过进入、退出对象监视器( Monito ... 阅读全文 »
SpringAOP 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | Spring AOP 实现原理静态代理众所周知 Spring 的 AOP 是基于动态代理实现的,谈到动态代理就不得不提下静态代理。实现如下: 假设有一接口 InterfaceA: 123public interface InterfaceA{ void exec();} 其 ... 阅读全文 »
TCP-IP 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | TCP/IP 协议TCP/IP 总结起来就三个要点 三次握手的意义。 超时重发。 滑动窗口。 三次握手 如图类似: 发送者问接收者我发消息了,你收到了嘛? 接收者回复发送者我收到了,你发消息没问题,我收消息也没问题。但我不知道我的发消息有没有问题,你收到了回复我下。 发送者告诉接收者,我收到你 ... 阅读全文 »
MySQL-Index 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | MySQL 索引原理现在互联网应用中对数据库的使用多数都是读较多,比例可以达到 10:1。并且数据库在做查询时 IO 消耗较大,所以如果能把一次查询的 IO 次数控制在常量级那对数据库的性能提升将是非常明显的,因此基于 B+ Tree 的索引结构出现了。 B+ Tree 的数据结构 如图所示是 B+ ... 阅读全文 »
OOM-analysis 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | OOM 分析Java 堆内存溢出在 Java 堆中只要不断的创建对象,并且 GC-Roots 到对象之间存在引用链,这样 JVM 就不会回收对象。 只要将-Xms(最小堆),-Xmx(最大堆) 设置为一样禁止自动扩展堆内存。 当使用一个 while(true) 循环来不断创建对象就会发生 OutOf ... 阅读全文 »
ReentrantLock 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | ReentrantLock 实现原理使用 synchronize 来做同步处理时,锁的获取和释放都是隐式的,实现的原理是通过编译后加上不同的机器指令来实现。 而 ReentrantLock 就是一个普通的类,它是基于 AQS(AbstractQueuedSynchronizer)来实现的。 是一个重 ... 阅读全文 »
MemoryAllocation 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | Java 运行时的内存划分 程序计数器记录当前线程所执行的字节码行号,用于获取下一条执行的字节码。 当多线程运行时,每个线程切换后需要知道上一次所运行的状态、位置。由此也可以看出程序计数器是每个线程私有的。 虚拟机栈虚拟机栈是有一个一个的栈帧组成,栈帧是在每一个方法调用时产生的。 每一个栈帧由局部变 ... 阅读全文 »
LinkedList 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | LinkedList 底层分析 如图所示 LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,所以也拥有 List 的一些特点(JDK1.7/8 之后取消了循环,修改为双向链表)。 新增方法123456789101112131415161718public boolean a ... 阅读全文 »
Limiting 发表于 2018-06-30 | 更新于: 2018-07-09 | 分类于 Github , Java-Interview | 限流算法限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性。 通常有以下两种限流方案: 漏桶算法 令牌桶算法 漏桶算法 漏桶算法非常简单,就是将流量放入桶中并按照一定的速率流出。如果流量过大时候并不会提高流出效率,而溢出的流量也只能是抛弃掉了。 这种算法很简单,但也非常粗暴,无法应对突 ... 阅读全文 »