Static

Thinking will not overcome fear but action will.

ReentrantLock源码分析

ReentrantLock

1. What? 1.1 原子操作 前提:Java语言最终也是也汇编的方式执行,所以从汇编的角度理解对变量的赋值操作过程:读取 -> 更新 -> 写入,在多线程下,赋值操作是不安全的。 原子操作是指“不可中断的一个或一系列操作”,所以jdk提供ReentrantLock,在多线程的情况下,让线程并行操作改为高效的串行操作。 2. Why? 为了在多线程的情况下,每...

秒杀系统实践

panic-buying

项目源码:https://github.com/whvixd/panic-buying 1. 架构图 只实现秒杀的后端部分 2. 技术点 框架:SpringBoot 代码管理:git 项目结构管理:maven 限流:guava的RateLimiter工具,@see 4.2 缓存:guavaCache,@see 4.3 消息...

秒杀系统

panic-buying

1. What? 1.1 简介 秒杀是在同一时刻大量请求争抢购买同一商品并完成交易的过程。比如12306抢票,双十一。 1.2 特点 同一时刻请求量大 2. Why? 为什么时要设计秒杀系统? 站在用户角度上,在秒杀时,软件体验要好,数据要准确;站在开发角度上,服务要可用,数据要一致,服务要高吞吐。 3. How? 如何设计秒杀系统? 3.1 动静分离 将大...

线程池源码分析

ThreadPoolExecutor

1. 线程池使用 // 1. 创建核心线程数为2,最大线程数为10的线程池 ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 10, 60,TimeUnit.SECONDS, new LinkedBlockingDeque<>(50), new ThreadPoolExecutor.CallerRunsPolicy(...

线程池

ThreadPoolExecutor

What? 1. 简介 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。 本文主要介绍j.u.c.ThreadPoolExecutor线程池的使用及源码分析 2. 成员 corePoolSize:核心线程数 maximumPoolSize:最大线程数 keepAliveTime:队列中任务等待执行时间 unit:队列中任...

发布者-订阅者实践

subscriber-publisher

参考 apache eventbus,实现订阅者-发布者模式 what? 1. 简介 发布者-订阅者实现了观察者模式,消息通知负责人通过中间商去注册/注销观察者,最后由消息通知负责人给观察者发布消息。 2. 成员 Agent:代理商(发布者),负责注册订阅者,消息的发布,具体逻辑实现类 @Subscribe:标识订阅者 @Prior:在同一类型订阅者中(相同的方法入参...

远程调用客户端实践

restful-client

实现HTTP Client调用工具,先介绍什么是RPC RPC定义 RPC(Remote Procedure Call Protocol)远程过程调用协议。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。 Client:RPC协议的调用方,对远程服务进行通讯的调用方。 可参考 https://www.jia...

Spock

test

what? Spock 框架是一个基于groovy语法的测试框架,由于使用groovy,所以使用起来比junit更加灵活,测试用例的写法更加简单、通熟易懂,可利用mock多场景数据测试项目代码,保证代码质量。 Spock与Junit对比 Spock JUnit 说明 setup()...

RocketMQ Install

mq

RocketMQ相关知识 参考 https://blog.csdn.net/javahongxi/article/details/84931747 CentOS6 上安装RocketMQ CentOS上安装 java git mvn 可参考 https://www.cnblogs.com/fly-piglet/p/7594488.html 1. 克隆RocketMQ项目...

junit4.1.2

test

junit版本:4.1.2 参考 常用注解: @BeforeClass:所有test方法执行之前执行 @AfterClass:在所有test方法执行完之后执行,比如:连接关闭,资源回收等操作 @Before:在每个case执行之前都会run @After:在每个case执行完之后都会run @Ignore:整个测试类run时忽略当前case @Test:...