主页

ZooKeeper的作用、应用场景和替代品

ZooKeeper 我想大家应该都略有耳闻,可能你在开发中没有直接使用过,但常用的 Hadoop、HBase、Kafka、Dubbo 等都有使用到 ZooKeeper。那 ZooKeeper 到底起到了什么样的作用,为什么这些框架、系统需要使用 ZooKeeper呢,我们在开发过程中应该如何使用 ZooKeeper,又是否有 ZooKeeper的替代品呢。本文将围绕以上问题,从以下三方面说起: 来源与作用; 经典应用场景; 替代品。 1. 来源与作用 ZooKeeper 的设计初衷是什么?这要从雅虎的一个研究小组说起。当时,研究人员发现雅虎内部的很多分布式系统都需要依赖一个组件进行分布式协调,但是这些组件往往都存在分布式单点问题。所以雅虎便组织开发了一个通用的无单...

阅读更多

避开NullPointerException的10条建议

1. 引言 NullPointerException应该是 Java 开发中最常出现的问题,也是 Java 程序员最容易犯的错误。虽然看起来是个小错误,但带来的影响却不小,Tony Hoare(null 引用的发明者)在 2009 年说过 NPE 大约给企业造成数十亿美元的损失。在这工作半年内,我就踩了好几次 NPE 的坑。举个例子,我需要在原有逻辑上加一段代码,而新加的代码报错抛出了 NPE,同时又没做异常处理,就直接导致后面的逻辑不运行了,影响了整个原有逻辑,太恐怖了。所以大家一定要小心避开 NPE 这个坑。 本文将会从以下两个方面说起: 发生 NPE 的可能情况 避开 NPE 的建议 2. 发生 NPE 的可能情况 首先我们需要清楚 NPE 是怎么发生的。 ...

阅读更多

Java回调的四种写法(反射、直接调用、接口调用、Lambda表达式)

1. 引言 在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。 以上是维基百科对“回调函数”的定义。对于回调,不同的语言有不同的回调形式,例如: C、C++ 允许将函数指针作为参数传递; JavaScript、Python 允许将函数名作为参数传递。 本文将介绍 Java 实现回调的四种写法: 反射; 直接调用; 接口调用; Lambda表达式。 在开始之前,先介绍下本文代码示例的背景,在 main 函数中,我们异步发送一个请求,并且指定处理响应的回调函数,接着 main 函数去做其他事,而当响应到达后,执行回调函数。 ...

阅读更多

如何记忆Spring Bean的生命周期

1. 引言 “请你描述下 Spring Bean 的生命周期?”,这是面试官考察 Spring 的常用问题,可见是 Spring 中很重要的知识点。 我之前在准备面试时,去网上搜过答案,大多以下图给出的流程作为答案。 但是当我第一次看到该图时,就产生了很多困扰,“Aware,BeanPostProcessor……这些都是什么啊?而且这么多步骤,太多了,该怎么记啊?”。 其实要记忆该过程,还是需要我们先去理解,本文将从以下两方面去帮助理解 Bean 的生命周期: 生命周期的概要流程:对 Bean 的生命周期进行概括,并且结合代码来理解; 扩展点的作用:详细介绍 Bean 生命周期中所涉及到的扩展点的作用。 2. 生命周期的概要流...

阅读更多

为什么枚举是单例模式的最佳方法

1. 引言 枚举类型(enum type)是在 Java 1.5 中引入的一种新的引用类型,是由 Java 提供的一种语法糖,其本质是 int 值。关于其用法之一,便是单例模式,并且在《Effective Java》中有被提到: 单元素的枚举类型已经成为实现 Singleton 的最佳方法 本文便是探究 “为什么枚举是单例模式的最佳方法?”。 答案先写在前面,两个字:“简单”。 public enum EnumSingleton { INSTANCE; } Java 在我们使用它的同时,解决了危害单例模式安全性的两个问题: 反射攻击 和 反序列化攻击。 本文的内容概要如下: 回顾常见的单例模式方法; 探索 Java 中的枚举是如何防止两种攻击...

阅读更多

明亮解我“工厂模式无用”之惑

明亮,是我的大学同学,我们一个在北京,一个在深圳,昨晚两人视频关于工厂模式聊到深夜。 明亮啊,我怎么觉得工厂模式没有用啊! 不会啊,工厂模式可是最常用的设计模式之一,你说说为啥觉得没用。 你看我给你举个例子,就以餐馆为例吧,类图如下所示,其中 FoodFactory、Food 是抽象类。 首先,如果餐馆的 cook() 通过工厂模式来创建 Food,代码如下: public class Restaurant { public Food cook() { FoodFactory factory = new ChineseFoodFactory(); Food food = factory.createFood(); ret...

阅读更多

回到1996, 一起领略JavaBeans的真正力量

Bean 这个词,Java 开发者们应该都很熟悉了,指代的是遵循一些规范的类。 首先,想聊聊为什么要取名为 Bean? 大家都知道 Java 的名字来源于一种咖啡,也正像 Java Logo 所直接表达的,一杯热气腾腾的咖啡: 那 Java Bean 连起来就是 咖啡豆 ╮( ̄▽ ̄)╭。 在 Java 中可以把 Bean 打包到 Jar 包中,我们脑补下,大概就是下面这张图: 把咖啡豆装进罐子里 ╮( ̄▽ ̄)╭。 (///∇//) 这些名字实在是太有趣了! 聊完了命名,接下来,我们正式回到1996年,开始考古了。 那年,我刚满一岁,JDK 也由 Beat版 升级为 1.0版,同年 Sun 提出了 JavaBeans 这套组件模型规范,其具体内容如下: 有...

阅读更多

和小曼一起走到MySQL行的尽头

小曼,重庆人,性格虽然内敛,但却是一位资深段子手。去年和我一起入职,工位坐我旁边后,承包了我半年的笑点。 我们还曾经一起去过那个被称作 “MySQL行尽头” 的地方。 那是一个普通的下午,耳边都是赶着需求的键盘声,我也码得正嗨皮,就在这时突然传来测试小姐姐的一声 “(╯°Д°)╯︵ ┻━┻小曼,你的 SQL 报错啦!” 我俩四目相对,眉头一皱,嗯?这 SQL 不是我们俩昨天一起看过的吗?而且在研发库上还成功运行了的,竟然报错了。 没办法,只能先停下手边工作,把 SQL 领回来看看: ALTER TABLE t ADD x VARCHAR(300); 这就是个普通的 DML 语句啊,为 t 表增加一个 x 字段,其类型为 VARCHAR,并且允许最大的字符长度 300。 ...

阅读更多