20.Redis怎样实现的分布式锁?
Redis 怎样实现的分布式锁?“锁”是我们实际工作和面试中无法避开的话题之一,正确使用锁可以保证高并发环境下程序的正确执行,也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。 我们本课时的面试题是,什么是分布式锁?如何实现分布式锁? 典型回答第06篇时讲了单机锁的一些知识,包括悲观锁、乐观锁、可重入锁、共享锁和独占锁等内容,但它们都属于单机锁也就是程序级别的锁,如果在分布式环境下使用就会出现锁不生效的问题,因此我们需要使用分布式锁来解决这个问题。 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理。 分布式锁示意图,如下图所示: 分布式锁的常见实现方式有四种: 基于 MySQL 的悲观锁来实现分布式锁,这种方式使用的最少,因为这种实现方式的性能不好,且容易造成死锁; 基于 Memcached 实现分布式锁,可使用 add 方法来实现,如果添加成功了则表示分布式锁创建成功; 基于 Redis 实现分布式锁,这也是本课...
21.Redis中如何实现的消息队列?实现的方式有几种?
Redis 中如何实现的消息队列?实现的方式有几种?细心的你可能发现了,本系列课程中竟然出现了三篇都是在说消息队列,第10篇时讲了程序级别的消息队列以及延迟消息队列的实现,而第15篇讲了常见的消息队列中间件 RabbitMQ、Kafka 等,由此可见消息队列在整个 Java 技术体系中的重要程度。本课时我们将重点来看一下 Redis 是如何实现消息队列的。 我们本课时的面试题是,在 Redis 中实现消息队列的方式有几种? 典型回答早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种: 使用 List 类型实现使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过 lpush、rpop 存入和读取实现消息队列的,如下图所示: lpush 可以把最新的消息存储到消息队列(List 集合)的首部,而 rpop 可以读取消息队列的尾部,这样就实现了先进先出,如下图所示: 命令行的实现命令如下: 12345678127.0.0.1:6379> lpush mq "java" #推送消息 java(inte...
23.JVM 的内存布局和运行原理
说一下 JVM 的内存布局和运行原理?JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会根据特定的操作系统生成对应的操作指令)。JVM 的功能很强大,像 Java 对象的创建、使用和销毁,还有垃圾回收以及某些高级的性能优化,例如,热点代码检测等功能都是在 JVM 中进行的。因为 JVM 是 Java 程序能够运行的根本,因此掌握 JVM 也已经成了一个合格 Java 程序员必备的技能。 我们本课时的面试题是,说一下 JVM 的内存布局和运行原理? 典型回答JVM 的种类有很多,比如 HotSpot 虚拟机,它是 Sun/OracleJDK 和 OpenJDK 中的默认 JVM,也是目前使用范围最广的 JVM。我们常说的 JVM 其实泛指的是 HotSpot 虚拟机,还有曾经与 HotSpot 齐名为“三大商业 JVM”的 JRockit 和...
24.垃圾回收算法有哪些?
垃圾回收算法有哪些?说到 Java 虚拟机不得不提的一个词就是**“垃圾回收”(GC,Garbage Collection)**,而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论持。 我们本课时的面试题是,如何判断一个对象是否“死亡”?垃圾回收的算法有哪些? 典型回答垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法。 引用计数算法(Reference Counting) 属于垃圾收集器最早的实现算法了,它是指在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,可以被垃圾收集器回收。 引用计数算法的优缺点很明显,其优点是垃圾回收比较及时,实时性比较高,只要对象计数器为 0,则可以直接进行回收操作;而缺点是无法解决循环引用的问题,比如以下代码: 1234567891011121314151...
27.单例的实现方式有几种?它们有什么优缺点?
单例的实现方式有几种?它们有什么优缺点?单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式。它不但被应用在实际的工作中,而且还是面试中最常考的题目之一。通过单例模式我们可以知道此人的编程风格,以及对于基础知识的掌握是否牢固。 我们本课时的面试题是,单例的实现方式有几种?它们有什么优缺点? 典型回答单例的实现分为饿汉模式和懒汉模式。 饿汉模式顾名思义,饿汉模式就好比他是一个饿汉,而且有一定的危机意识,他会提前把食物囤积好,以备饿了之后直接能吃到食物。对应到程序中指的是,在类加载时就会进行单例的初始化,以后访问时直接使用单例对象即可。 饿汉模式的实现代码如下: 12345678910111213141516171819202122public class Singleton { // 声明私有对象 private static Singleton instance = new Singleton(); // 获取实例(单例对象) public static Singleton get...
25.你用过哪些垃圾回收器?它们有什么区别?
你用过哪些垃圾回收器?它们有什么区别?上一课时我们讲了垃圾回收的理论知识,而本课时将介绍这些理论知识的具体实践。垃圾回收器也叫垃圾收集器,不同的厂商对垃圾收集器的实现也是不同的,这里主要介绍目前使用最广泛的 OracleJDK 中自带的 HotSpot 虚拟机中的几个垃圾收集器。 我们本课时的面试题是,你用过哪些垃圾回收器?它们有什么区别? 典型回答《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是 OracleJDK 中自带的 HotSpot 虚拟机。HotSpot 中使用的垃圾收集器主要包括 7 个:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS 和 G1(Garbage First)收集器。 Serial 收集器属于最早期的垃圾收集器,也是 JDK 1.3 版本之前唯一的垃圾收集器。它是单线程运行的垃圾收集器,其单线程是指在进行垃圾回收时所有的工作线程必须暂停,直到垃圾回收结束为止,如下图所示: Serial 收集器的特点是...
28.你知道哪些设计模式?分别对应的应用场景有哪些?
你知道哪些设计模式?分别对应的应用场景有哪些?上一课时我们讲了单例模式的 8 种实现方式以及它的优缺点,可见设计模式的内容是非常丰富且非常有趣。我们在一些优秀的框架中都能找到设计模式的具体使用,比如前面 MyBatis 中(第 13 课时)讲的那些设计模式以及具体的使用场景,但由于设计模式的内容比较多,有些常用的设计模式在 MyBatis 课时中并没有讲到。因此本课时我们就以全局的视角,来重点学习一下这些常用设计模式。 我们本课时的面试题是,你知道哪些设计模式?它的使用场景有哪些?它们有哪些优缺点? 典型回答设计模式从大的维度来说,可以分为三大类:创建型模式、结构型模式及行为型模式,这三大类下又有很多小分类。 创建型模式是指提供了一种对象创建的功能,并把对象创建的过程进行封装隐藏,让使用者只关注具体的使用而并非对象的创建过程。它包含的设计模式有单例模式、工厂模式、抽象工厂模式、建造者模式及原型模式。 结构型模式关注的是对象的结构,它是使用组合的方式将类结合起来,从而可以用它来实现新的功能。它包含的设计模式是代理模式、组合模式、装饰模式及外观模式。 行为型模式关注的是对象的行为,它...
30.如何保证接口的幂等性常见的实现方案有哪些
如何保证接口的幂等性?常见的实现方案有哪些?幂等性问题是面试中常见的面试问题,也是分布式系统最常遇到的问题之一。在说幂等性之前,我们先来看一种情况,假如老王在某电商平台进行购物,付款的时候不小心手抖了一下,连续点击了两次支付,但此时服务器没做任何验证,于是老王账户里面的钱被扣了两次,这显然对当事人造成了一定的经济损失,并且还会让用户丧失对平台的信任。而幂等性问题说的就是如何防止接口的重复无效请求。 我们本课时的面试题是,什么是幂等性?如何保证接口的幂等性? 典型回答幂等性最早是数学里面的一个概念,后来被用于计算机领域,用于表示任意多次请求均与一次请求执行的结果相同,也就是说对于一个接口而言,无论调用了多少次,最终得到的结果都是一样的。比如以下代码: 12345678910111213141516public class IdempotentExample { // 变量 private static int count = 0; /** * 非幂等性方法 */ public static void addCount() {...
29.红黑树和平衡二叉树有什么区别
红黑树和平衡二叉树有什么区别?数据结构属于理解一些源码和技术所必备的知识,比如要读懂 Java 语言中 TreeMap 和 TreeSet 的源码就要懂红黑树的数据结构,不然是无法理解源码中关于红黑树数据的操作代码的,比如左旋、右旋、添加和删除操作等。因此本课时我们就来学习一下数据结构的基础知识,方便看懂源码或者是防止面试中被问到。 我们本课时的面试题是,红黑树和二叉树有什么区别? 典型回答要回答这个问题之前,我们先要弄清什么是二叉树?什么是红黑树? 二叉树(Binary Tree)二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构,即不存在分支大于 2 的节点,二叉树的数据结构如下图所示: 这是一棵拥有 6 个节点深度为 2(深度从 0 开始),并且根节点为 3 的二叉树。 二叉树有两个分支通常被称作“左子树”和“右子树”,而且这些分支具有左右次序不能随意地颠倒。 二叉查找树一棵空树或者满足以下性质的二叉树被称之为二叉查找树: 若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不为空,则右子树上所有节点的值均大于或等...
31.TCP 为什么需要三次握手
TCP 为什么需要三次握手?TCP 协议是我们每天都在使用的一个网络通讯协议,因为绝大部分的网络连接都是建立在 TCP 协议上的,比如你此刻正在看的这篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文本传送协议) 应用层协议的基础上的,而 HTTP 协议的“底层”则是建立在 TCP 的传输层协议上的。因此可以理解为,你之所以能看到本篇文章就是得益于 TCP 协议的功劳。 我们本课时的面试题是,说一下 TCP 三次握手的执行流程,以及为什么需要三次握手? 典型回答在回答这个问题之前,首先我们需要搞清楚两个概念,第一,什么是 TCP?第二,什么是 TCP 连接?只有搞明白了这两个问题,我们才能彻底搞懂为什么 TCP 需要三次握手? 什么是 TCP?首先来说 TCP(Transmission Control Protocol,传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层协议。从它的概念中我们可以看出 TCP 的三个特点:面向连接、可靠性和面向字节流。 TCP 的特点面向连接:是指 TCP 是面向客户端和服务器端连接的通讯协议,使用它可...














