目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

软件设计原则

开闭原则  一个软件实体如类、模块、函数应该对扩展开放,对修改关闭。用抽象构建框架,用实现扩展细节,面向抽象编程。(继承、多态)  优点:提高软件系统的可复用性及可维护性。 ICourse public interface ICourse { Integer getId(); String getName(); Double getPrice(); } JavaCourse public class JavaCourse implements ICourse{ private Integer Id; private String name; private Double price; public JavaCourse(Integer id, String name, Double price) { this.Id = id; this.name = name; this.price = price; } public Integer getId() { return this.Id; } public String getName() { return this.name; } ....

Rocket.Chat

该文章已经加密。

Netty 背景与领域知识

Netty 背景  Netty 由 Trustin Lee (韩国、Line 公司) 2004 年开发。 * 本质:网络应用程序框架 * 实现:异步、事件驱动 * 特性:高性能、可维护、快速开发 * 用于:开发服务器和客户端 为什么不直接使用 JDK NIO  直接使用 JDK NIO = 一个人在战斗。 Netty 做的更多 * 支持常用应用层协议。 * 解决传输问题:粘包、半包现象。 * 支持流量整形。 * 完善的断连、Idle 等异常处理等。 Netty 做的更好 * 规避 JDK NIO bug: epoll bug (异常唤醒空转导致 CPU 100%) JDK NIO 2.4 版本。 * API 更优化、更强大。 * 隔离变化、屏蔽细节。 * 直接用 JDK 实现,代码量太多、BUG 也多。 * Netty 已经维护了 15 年。 网络通信框架对比  Netty 没有竞争对手。 * Apache Mina (Trustin Lee 背书 Netty) * Sun Grizzly (用的少、文档少、更新少) * Apple Swift NIO、ACE 等 (其他语言、....

High Performance Cache

缓存作用  缓存是在实际生产中非常常用的工具,用了缓存以后,我们可以避免重复计算,提高吞吐量。  一个功能完备、性能强劲的缓存,需要考虑的点非常多。 第一阶段 如果不使用 synchronized 多线程同时 put、扩容时候会出现线程安全隐患 使用 synchronized 性能差,多线程需要串行化的方式执行 doCompute 代码复用性差,代码侵入性强,违反开闭原则。 * 性能差:多个线程同时想计算的时候,需要慢慢等待(同步方法) import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 描述: 最简单的缓存形式:HashMap */ public class ImoocCache1 { //final 增加安全性,可读性 private final HashMap<String,Integer> cache = new HashMap<>(); public synchronized Integer computer(Str....

Future、Callable

Runnable 缺陷 不能返回一个返回值 run() 方法中不能抛出 checked Exception (方法签名),只能在 run() 方法中使用 try/catch 进行异常捕获。 public abstract void run(); Callable 接口 类似于 Runnable,被其他线程执行的任务 实现 call 方法 有返回值 Future  Future 的核心思想是:一个方法的计算过程可能非常耗时,一直在原地等待方法返回,显然不明智。可以把该计算过程放到线程池去执行,并通过 Future 去控制方法的计算过程,在计算出结果后直接获取该结果。 Callable 和 Future 的关系 Future.get() 来获取 Callable 接口返回的执行结果,Future.isDone()来判断任务是否已经执行完了,以及取消这个任务,限时获取任务的结果等。 在 call() 未执行完毕之前,调用 get() 的线程(假设是主线程)会被阻塞,直到 call() 方法返回了结果后,此时 future.get() 才会得到该结果,然后主线程 CIA 会切换到 ....

AbstractQueuedSynchronizer

AQS 的作用  ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock 等类具有的 协作(同步)功能,底层都是一个共同的基类 AQS。  AQS 是一个用于构建锁、同步器、协作工具类的工具类(框架)。有了 AQS 以后,更多的协作工具类都可以很方便得被编写出来。  一句话总结:有了 AQS,构建线程协作类就容易多了。 Semaphore 和 AQS 的关系  Semaphore 内部有一个 Sync 类, Sync 类继承了 AQS。 如果没有 AQS 每个协作工具自己实现一些功能:(这些功能都是通用的) * 同步状态的原子性管理(例如:CountDownLatch 计数器) * 线程的阻塞与解除阻塞 * 队列的管理 在并发场景下,自己正确且高效实现这些内容,是相当有难度的,所以我们用 AQS 来帮我们把这些脏活累活都搞定,我们只关注业务逻辑就行了。甚至我们可以利用 AQS 自定义一个线程协作类。 AQS 的重要性、地位  AbstactQueuedSynchronizer 是 Doug Lea 写的,从....

SDKMAN

SDKMAN简介  JDK版本迭代太快,多个版本手动改 JAVA_HOME 太痛苦。 安装 SDKMAN windows 安装需要 bash, zip, unzip, curl。 包含关系: chocolatey(Windows的包管理工具) - zip - unzip git bash(Windows的git终端) - bash - curl C:\> choco install unzip C:\> choco install zip # 安装Git # 打开 Git bash 终端,执行命令: curl -s "https://get.sdkman.io" | bash [root@master ~]# sdk ls java ================================================================================ Available Java Versions ==================================================================....