Java ThreadPoolExecutor 线程池源码分析

2017-03-14
阅读 16 分钟
8.3k
线程池常见实现 线程池一般包含三个主要部分: 调度器: 决定由哪个线程来执行任务, 执行任务所能够的最大耗时等 线程队列: 存放并管理着一系列线程, 这些线程都处于阻塞状态或休眠状态 任务队列: 存放着用户提交的需要被执行的任务. 一般任务的执行 FIFO 的, 即先提交的任务先被执行 调度器并非是必须的, 例如 Java 中实...

Thrift 简易入门与实战

2017-03-07
阅读 14 分钟
17.8k
thrift是一个软件框架, 用来进行可扩展且跨语言的服务的开发. 它结合了功能强大的软件堆栈和代码生成引擎, 以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务.官网地址: thrift.apache.org

Java 之泛型通配符 ? extends T 与 ? super T 解惑

2017-02-21
阅读 6 分钟
23k
首先, 说到 Java 的泛型, 我们必须要提到的是Java 泛型的类型擦除机制: Java中的泛型基本上都是在编译器这个层次来实现的. 在生成的 Java 字节代码中是不包含泛型中的类型信息的. 使用泛型的时候加上的类型参数, 会被编译器在编译的时候去掉. 这个过程就称为类型擦除. 如在代码中定义的List<Object>和List<Stri...

在同一个类中调用另一个方法没有触发 Spring AOP 的问题

2017-02-17
阅读 4 分钟
18.3k
在这个例子中, 我们定义了一个注解 MyMonitor, 这个是一个方法注解, 我们的期望是当有此注解的方法被调用时, 需要执行指定的切面逻辑, 即执行 MyAopAdviseDefine.logMethodInvokeParam 方法.

MySQL 性能优化神器 Explain 使用分析

2017-01-16
阅读 12 分钟
169.1k
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化.EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 Explain 就可以了, 例如:

MySQL 使用 SSL 连接(附 Docker 例子)

2016-12-15
阅读 9 分钟
15.5k
当 have_ssl 为 YES 时, 表示此时 MySQL 服务已经支持 SSL 了. 如果是 DESABLE, 则需要在启动 MySQL 服务时, 使能 SSL 功能.

对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

2016-11-22
阅读 7 分钟
32.2k
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when transmitting a file over a network.

彻底征服 Spring AOP 之 实战篇

2016-11-13
阅读 10 分钟
35.1k
看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体的例子吧.下面的几个例子是我在工作中所遇见的比较常用的 Spring AOP 的使用场景, 我精简了很多有干扰我们学习的注意力的细枝末节, 以力求整个例子的简洁性.

彻底征服 Spring AOP 之 理论篇

2016-11-13
阅读 10 分钟
84.3k
其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, 含义总有着各种莫名其妙的差别. 鉴于此, 我在本章的开头, 着重为为大家介绍一个 Spring AOP 的各项术语的基本含义. 为了术语传达的准确性, ...

记一次有趣的 Netty 源码问题

2016-11-08
阅读 12 分钟
6k
背景 起因是一个朋友问我的一个关于 ServerBootstrap 启动的问题.相关 issue他的问题我复述一下:ServerBootstrap 的绑定流程如下: {代码...} 在 AbstractUnsafe.register0 中可能会调用 pipeline.fireChannelActive(), 即: {代码...} 并且在 AbstractUnsafe.bind 中也会有 pipeline.fireChannelActive() 的调用, 即: {代...

Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(二)

2016-11-07
阅读 20 分钟
26.5k
在 Netty 中, 一个 EventLoop 需要负责两个工作, 第一个是作为 IO 线程, 负责相应的 IO 操作; 第二个是作为任务线程, 执行 taskQueue 中的任务. 接下来我们先从 IO 操纵方面入手, 看一下 TCP 数据是如何从 Java NIO Socket 传递到我们的 handler 中的.

Netty 源码分析之 三 我就是大名鼎鼎的 EventLoop(一)

2016-11-07
阅读 10 分钟
56.1k
目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO 的前生今世 之三 NIO Buffer 详解 Java NIO 的前生今世 之四 NIO Selector 详解 Netty 源码分析之 零 磨刀不误砍柴工 源码分析环...

Unix 网络 IO 模型: 同步异步, 傻傻分不清楚?

2016-11-02
阅读 4 分钟
8.8k
阻塞 IO, 非阻塞 IO, 同步 IO, 异步 IO 这些术语相信有不少朋友都也不同程度的困惑吧? 我原来也是, 什么同步非阻塞 IO, 异步非阻塞 IO 的, 搞的头都大了. 后来仔细读了一遍《UNIX 网络编程卷一 套接字联网 API(第三版)》的 6.2 章节, 终于把这些名词搞懂了.

Netty 源码分析之 二 贯穿Netty 的大动脉 ── ChannelPipeline (二)

2016-10-28
阅读 14 分钟
24.8k
目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO 的前生今世 之三 NIO Buffer 详解 Java NIO 的前生今世 之四 NIO Selector 详解 Netty 源码分析之 零 磨刀不误砍柴工 源码分析环...

Netty 源码分析之 二 贯穿Netty 的大动脉 ── ChannelPipeline (一)

2016-10-28
阅读 11 分钟
33.4k
目录 源码之下无秘密 ── 做最好的 Netty 源码分析教程 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO 的前生今世 之三 NIO Buffer 详解 Java NIO 的前生今世 之四 NIO Selector 详解 Netty 源码分析之 零 磨刀不误砍柴工 源码分析环...

Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (服务器端)

2016-10-26
阅读 13 分钟
35.6k
目录 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO 的前生今世 之三 NIO Buffer 详解 Java NIO 的前生今世 之四 NIO Selector 详解 Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建 Netty 源码分析之 一 揭开 Bootstrap 神秘...

Netty 源码分析之 一 揭开 Bootstrap 神秘的红盖头 (客户端)

2016-10-26
阅读 20 分钟
47.1k
目录 Netty 源码分析之 番外篇 Java NIO 的前生今世 Java NIO 的前生今世 之一 简介 Java NIO 的前生今世 之二 NIO Channel 小结 Java NIO 的前生今世 之三 NIO Buffer 详解 Java NIO 的前生今世 之四 NIO Selector 详解 Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建 Netty 源码分析之 一 揭开 Bootstrap 神秘...

源码之下无秘密 ── 做最好的 Netty 源码分析教程

2016-10-26
阅读 2 分钟
92.2k
在工作中, 虽然我经常使用到 Netty 库, 但是很多时候对 Netty 的一些概念还是处于知其然, 不知其所以然的状态, 因此就萌生了学习 Netty 源码的想法.刚开始看源码的时候, 自然是比较痛苦的, 主要原因有两个: 第一, 网上没有找到让我满意的详尽的 Netty 源码分析的教程; 第二, 我也是第一次系统地学习这么大代码量的源码. ...

Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建

2016-10-26
阅读 2 分钟
22.5k
目录 此文章属于 源码之下无秘密 ── 做最好的 Netty 源码分析教程 系列文章之一. 代码下载 首先到 Netty 的 Github 仓库 中, 点击右边绿色的按钮: 拷贝 git 地址: git@github.com:netty/netty.git然后在终端中输入如下命令, 克隆 Netty 工程: {代码...} Netty 工程源码较大, 加上国内网络问题, 下载 Netty 源码可能会比...

RabbitMQ AMQP 消息模型攻略

2016-10-10
阅读 7 分钟
12k
近期对消息队列比较感兴趣, 因此特意看了一下 RabbitMQ 相关的知识, 不过在学 RabbitMQ 时, 对 AMQP 的消息模型总是理解的不透彻, 于是在官网上找了一篇介绍 AMQP 消息模型的文章, 详细地看了一下.还是要感叹一下啊, 官网的文章果然是最权威的, 看了以后有了不小的收获.下面是我学习 AMQP 消息模型时的记录, 其内容大部...

Java 动态代理(Dynamic proxy) 小结

2016-10-07
阅读 7 分钟
9.2k
不论是静态代理还是动态代理, 其本质都是代理模式的一种实现, 那么什么是代理模式呢?代理模式, 即给某一个对象提供一个代理, 并由代理对象控制对原对象的引用.代理模式其实取材于实际生活, 例如我们生活中常见的房屋租赁代理, 我们在租房时, 一般不是直接和房东打交道, 而是和中间商打交道, 即中间商代理了房东, 我们通...

Golang redis 操作初体验

2016-10-06
阅读 11 分钟
60.7k
通过 redis.NewClient 函数即可创建一个 redis 客户端, 这个方法接收一个 redis.Options 对象参数, 通过这个参数, 我们可以配置 redis 相关的属性, 例如 redis 服务器地址, 数据库名, 数据库密码等.下面是一个连接的例子:

关于 String.intern() 的思考

2016-10-04
阅读 2 分钟
5.3k
我看到一个 segmentfault 上的问题, 是关于 String.intern() 的, 感觉比较有意思, 于是自己也去探索了一下, 有了一些自己的见解, 于是在此记录下来.

Java 常见内存溢出异常与代码实现

2016-10-03
阅读 6 分钟
7.8k
Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常.

浅析 Netty 实现心跳机制与断线重连

2016-09-18
阅读 15 分钟
70.2k
顾名思义, 所谓 心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.

使用 Docker 一步搞定 ZooKeeper 集群的搭建

2016-09-14
阅读 5 分钟
42.1k
原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 Docker 的镜像了, 于是就尝试了一下, 发现真是爽爆了, 几个命令就可以搭建一个完整的 ZK 集群. 下面我简单记录一下使用 Docker 搭建 ZK 集群的一些步骤.

Golang SQL 操作初体验

2016-09-12
阅读 6 分钟
20k
Golang 提供了 database/sql 包用于对 SQL 的数据库的访问, 在这个包中, 最重要的自然就是 sql.DB 了.对于 sql.DB, 我们需要强调的是, 它并不代表一个数据库连接, 它是一个已存在的数据库的抽象访问接口. sql.DB 为我们提供了两个重要的功能:

Java NIO 的前生今世 之四 NIO Selector 详解

2016-09-05
阅读 7 分钟
39.7k
Selector 允许一个单一的线程来操作多个 Channel. 如果我们的应用程序中使用了多个 Channel, 那么使用 Selector 很方便的实现这样的目的, 但是因为在一个线程中使用了多个 Channel, 因此也会造成了每个 Channel 传输效率的降低. 使用 Selector 的图解如下:

Java NIO 的前生今世 之三 NIO Buffer 详解

2016-09-05
阅读 7 分钟
24.3k
当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中.实际上, 一个 Buffer 其实就是一块内存区域, 我们可以在这个内存区域中进行数据的读写. NIO Buffer 其实是这样的内存块的一个封装, 并提供了一些操作方法让我们能够方便地进行...

Java NIO 的前生今世 之二 NIO Channel 小结

2016-09-05
阅读 5 分钟
26.6k
通常来说, 所有的 NIO 的 I/O 操作都是从 Channel 开始的. 一个 channel 类似于一个 stream.java Stream 和 NIO Channel 对比