付威 付威的网络博客

一个有效的收拾程序运行残局的方法--ShutdownHook

发现addShutdownHook 在阅读QMQ的源码的时候,在Server端启动的时候,注册了一个shutdown的代码,具体的代码如下: Runtime.getRuntime().addShutdownHook(new Thread(wrapper::destroy)); addShutdownHook作用 addShutdownHook方法可以添加一个指定的线程来在Java程...

最近的学习的技术路线

最近研究的东西有点杂,也有点乱,有点不太成体系,也不够深入,收获还是有的,但是并没有想象中的多。总感觉最近在憋着一股劲准备写点什么东西,但是心里总感觉不踏实,总有一种危机感在身边。 本着越是乱 越是要整理的原则,自己列了下学习和复习的技术路线: 基础知识 Spring的使用和源码(源码可以晚点) 并发编程的使用和原理,着重理解锁的细节,能够手写实现锁 类加载机制和垃圾回...

分布式队列的几个名词和解释--以kafka为例

Topic 或者Subject 每一个生产者都需要向队列中生产消息,不同的生产者生产消息需要有所区别,供对应的消费者消费消息,这个是队列名称之为 Topic或者Subject MessageLog,ConsumerLog 队列的消息需要一个存储的介质,Kafka的对应的存储为文件存储,生产者生产的消息存储在MessageLog, 然后根据不同的消费和路由规则路由,投递到对应的服务器上面...

设计模式--01.单例模式

在程序设计中,需要保证一个只有一个对象实例,就是所谓的单例模式。在java中,有很多单例模式的实现,这篇博客是对这几种单例模式的优缺点进行分析和优化: 饿汉模式 所谓饿汗模式,就是优先创建对象,对象在类加载的时候就已经创建好了,具体的代码如下: private static Singleton01 instance = new Singleton01(); public st...

Guava学习笔记--01. Joiner使用

对于Guava的认识来自于阅读QMQ源码的时候,有很多没有使用过的Java方法和集合,所以就查了查,发现是用的是Guava的类库,所以就有了下面的博客: 1. 字符串的拼接 private final List<String> stringList = Arrays.asList("Google", "Guava", "Java", "Scala", "Kafka...

TCP三次握手和四次挥手

三次握手–连接 在通信的过程中,Client与Server建立TCP连接需要三次握手,为什么需要三次握手呢?又是怎么握手的过程? TCP连接是可靠的通信方式,必须要保证两端都同时有效,且线路通畅。 如同两个人通话,但并不确定对方能不能听到,经历几次才能确保通信方式可靠呢? A: 请求连接,收到请回复密码1 B:可以连接,密码是1。你听到了吗?听到回复密码2 A:我听到了,密码2。 ...

一文彻底了解Mysql索引

在不借助DB引擎情况下,想完成数据的持久化存储,最简单的方法写一个文件存在本地,读取的时候加载文件到内存,然后进行筛选。 存储一个user在本地。 id|userName|userCode|sex|phoneNumber 1,xiaoming,001,m,126xxx 2,xiaohong,002,w,123xxx ... 上面满足了我们的需求,看到这种数据格式,查询的...

Mysql的索引实现机制

对于DB来说最重要的无非是增删改查性能,而构建一个好的索引是实现高效DB操作的前提。其实没一个DB的引擎,说到底都是文件系统的管理。 对于mysql,索引使用的是B+树的数据结构,B+树具有高度低,关键字存储多,更友好操作系统的IO的读写。 mysql有Mysam和InnerDB两个存储引擎,Mysam是数据和索引分开,InnerDb数据和索引是在一个文件。 Mysam mysam存...

B-Tree和B+树

B树和B+树是很多数据库索引采用的数据结构,为什么会使用B树,而不采用更常见的二叉树的呢? 举个例子,有这么几个数字:1,2,3,4,5,6,7,8,9,0,分别生成AVL树,B树 二叉树生出的树的度为4,而3阶B树高度只是3.如果B树的阶数再多的话,就可以获得更小的高度度。 (6阶的B树) 树的度带来更深入查询,会带来更多的IO读写。 除了二叉树的深度太深的原因,...

手写JDK动态代理

反射动态代理 为了能够更好实现AOP的思想,在Java中有了动态代理概念,与动态代理相对应的就是静态代理,首先看下面的代码。 public interface IWoker { String sayHello(String name,String code) ; } public class Worker implements IWoker{ @Override...

Unsage类的使用

Java是以安全著称,但在Java中有一个类是一个Bug级别的存在,那就是Unsafe. 前面已经说过Unsafe在java中的使用,此处我们直接说用法: 避免初始化 当你想跳过对象初始化的阶段,或者绕过构造函数的检查,去实例化没有任何公共构造函数的类,可以使用allocateInstance: class A { private long a; // not...

CAS的性能问题

昨天写了一个计数器的类,性能高于JDK,思考了很久,后来被同学点破。 public void increase() { long before = unsafe.getLongVolatile(this, offset); while (!unsafe.compareAndSwapLong(this, offset, before, before + 1)) { ...

写了一个性能比AtomicLong性能还高的计数器

今天在学习CAS的时候,想手写一个CAS的计数器,与JDK中的Atomic(AtomicLong,AtomicInteger等)系列的做个比较,本想性能应该能比JDK要差一丢丢,但却加了一个让线程让出时间片的代码,性能反而更高。 由于使用java中的Unsafe类,存在安全问题,直接使用会抛出SecurityException异常,所以Unsage无法直接在代码中调用,有两种方法可以解决这...

redis分布式锁的问题和解决

分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求。具体伪代码如下: public void doSomething(String userId){ User user=getUser(userId); if(user==null){ user.setUserName(...

树和二叉树简介

树的定义 为了保证数据的能够有效的查询,可以使用顺序结构。为了保证数据的插入效率,我们可以使用链型结构。但在某些场合,我们需要同时兼顾查询效率和插入的效率,应该怎么做? 树(Tree)型结构是一类常用的高效的非线性的数据结构,兼顾了顺序表的查询效率和链表的插入效率。例如我们电脑中的目录结构,采用的就是一种树形结构关系。 树的具体结构形状如下图: 关于树有以下几个定义: 度:每个节...

什么是协程

协程(Coroutine)又称为微线程,我们知道线程是CPU的执行的最小单位,线程执行的最小代码单位是方法。 比如在执行的时候,一个线程从程序的入口调用Main方法,Main调用A方法,A方法又调用B方法,整个函数的执行完成的顺序是B->A->Main。这个调用的顺序是明确的,是通过压栈和出栈的方式确定的。 而协程不同, Main调用B,在调用B的过程中可以中断,Main函数...