Zookeeper(1)---初识

一.ZK简述 Zookeeper,它是一个分布式程序的协调服务,它主要是用来解决分布式应用中的一些数据管理问题,比如集群管理,分布式应用配置,分布式锁,服务注册/发现等等。 它是一个类似于文件系统的树状结构。每个目录被称为znode,可以删除目录,添加子目录这些操作,不同的是每个znode上面都是存 ... »

RocketMQ(1)---架构原理及环境搭建

一、架构简述 RocketMQ阿里开源的一个分布式消息传递和流媒体平台,具有低延迟,高性能和可靠性, 万亿级容量和灵活的可伸缩性。跟其它中间件相比,RocketMQ的特点是纯JAVA实现,在发生宕机和其它故障时消息丢失率更低。 它由四个部分组成:nameserver,broker,生产者和消费者。它 ... »

RabbitMQ(2)---高级使用

1.ack和限流 ack也就是消息确认签收,分为自动签收和手动签收。之前的交换机demo中:channel.basicConsume(queueName,true, consumer); 第二个参数就是自动签收,如果我们要手动签收则需要改成false,再去消息处理中手动签收即可 当我们消息队列中已经 ... »

面试问题---JAVA程序CPU占用过高怎么定位

今天一个电话面试问了这个问题。回来查了下答案,自己也顺带操作一遍,做个记录。之前知道jstack工具可以查看线状态这些。比如死锁这些,主要是之前不知道top -H -p pid这个命令的使用,这命令可以看到进程下面线程信息,拿到线程ID,然后再结合jstack命令使用就可以解决这个问题了。下面记录一 ... »

RabbitMQ(1)---基本概念

一、安装RabbitMQ 安装直接用docker安装,如果手动安装的话比较繁琐,还要安装erlang语言的环境。在安装有docker机器上执行官网提供的指令(https://www.rabbitmq.com/download.html):docker run -it --rm --name rabb ... »

JUC(4)---java线程池原理及源码分析

线程池,既然是个池子里面肯定就装很多线程。 如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁 线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线 程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。因此Java中提供线程池对 ... »

JUC(3)---CountDownLatch、CyclicBarrier和AQS

CountDownLatch可以让一个线程等待其他线程完成了各自的工作之后再执行。比如说一个切菜,一个人切肉,都准备完毕之后才能炒肉。 构造方法: public CountDownLatch(int count) count等待的线程数量 关键API: countDown() 分线程执行完减少计数 ... »

Semaphore和AQS

Semaphore意思的信号量,它的作用是控制访问特定资源的线程数量 构造方法: public Semaphore(int permits) public Semaphore(int permits, boolean fair) permits:允许同时访问的线程数量 fair:是否公平,若true ... »

ReentrantLock和AQS

Synchronized是jvm内置的锁;而java.util.concurrent包下面的Lock锁是大佬(Doug Lea)用java代码实现的显示锁。 Juc包下面锁相比jvm内置的锁更加灵活。围绕着AQS(AbstractQueuedSynchronizer)实现了一系列性质的锁,比如共享/ ... »

Synchronized加锁、锁升级和java对象内存结构

首先了解一下JMM中定义的内存操作: 一个线程操作数据时候都是从主内存(堆内存)读取到自己工作内存(线程私有的数据区域)中再进行操作。对于硬件内存来说,并没有工作内存和主内存的区分,这都是java内存模型划分出来的,它只是一种抽象的概念,是一组规则,并不是实际存在的。Java内存模型中定义了八种同步 ... »

算法---BitMap

问题: 假设有3亿个整数(范围0-2亿),如何判断某一个树是否存在。局限条件一台机器,内存500m。 常规的思路:我们可以将数据存到一个集合中,然后判断某个数是否存在;或者用一个等长的数组来表示,每个数对应的索引位置,存在就标记为1,不存在0。当然如果设备条件允许,上面的这方案是可行的。 但是现在我 ... »

高级数据结构---堆树和堆排序

堆树介绍: 之前在二叉树的时候说到过一种特殊的二叉树 完全二叉树(除了最后一层,其他层的每个结点都是满的,且最后一层结点全部靠左排列,这样就可以很方便的用数组来表示,下标从0开始如果父结点索引是i那么它两个子结点的索引就是2i+1和2i+2,具体的图解见二叉树)。而堆树又是一种特殊的完全二叉树。它的 ... »

高级数据结构---赫(哈)夫曼树及java代码实现

我们经常会用到文件压缩,压缩之后文件会变小,便于传输,使用的时候又将其解压出来。为什么压缩之后会变小,而且压缩和解压也不会出错。赫夫曼编码和赫夫曼树了解一下。 赫夫曼树: 它是一种的叶子结点带有权重的特殊二叉树,也叫最优二叉树。既然出现最优两个字肯定就不是随便一个叶子结点带有权重的二叉树都叫做赫夫曼 ... »

域名和服务器绑定及https协议更换

服务器是之前已经购买了的 1.腾讯云产品中搜索域名注册(产品太多了懒得找,直接搜索来得快些) 2.进去之后可以选择各种后缀的域名,输入自己喜欢的,看看哪些后缀是没有被注册的。自己挑选一个就可以,按照指导给付钱就行了。看见有个xyz后缀的,刚好是三维坐标系,就随手搜了下三维时代,然后就注册了这个。 3 ... »

高级数据结构---红黑树及其插入左旋右旋代码java实现

前面我们说到的二叉查找树,可以看到根结点是初始化之后就是固定了的,后续插入的数如果都比它大,或者都比它小,那么这个时候它就退化成了链表了,查询的时间复杂度就变成了O(n),而不是理想中O(logn),就像这个样子 如果我们有一个平衡机制,让这棵树可以动起来,比如将4变成根结点,是不是查询效率又可以提 ... »

高级数据结构---二叉查找树及其增删改查实现

二叉树查找树: 二叉查找树也叫二叉搜索树,二叉排序树。它也是一种特殊的二叉树, 它具有以下特点 1.如果它的左子树不为空,则左子树上结点的值都小于根结点。 2.如果它的右子树不为空,则右子树上结点的值都大于根结点。 3.子树的子树同样也要遵循以上两点 为什么又叫做二叉排序树,因为具有这种特殊特点的二 ... »

高级数据结构---二叉树

树是一种一对多的数据结构,之前的数组,栈这些都是一对一的数据结构。 树是n个结点的有限集。n=0称空树。在任意一棵非空树中:有且仅有一个根(root)结点;n>1时,其余结点可分为m个互不相交的的有限集,其中每个集合又是一棵树,称为根的子树。 前面三个都是树,最后一个不是树,因为最后一个的数据相交了 ... »

算法---贪心算法和动态规划

贪心算法顾名思义在一个贪字上面,它在解决某个问题的时候,总是先从眼前利益出发。也就是说只顾眼前,不顾大局,所以它是局部最优解。它的核心的就是局部最优推出全局最优。 比如公司只有一个会议室,明天有几场同样的重要的会议要开,怎么安排会议才能尽可能的多开会。 如果我们将所有会议的结束时间从小到大排序。然后 ... »

算法---排序

排序过程详细的动态图可参考https://www.cnblogs.com/onepixel/articles/7674659.html 1.插入排序 稳定O(n^2) 稳定的意思是a=b,原本a在b前面,排序完成后a也在b前面。 插入排序的思路就是将数组逻辑上分成两段,一段是排好序的,一段是未排序的 ... »

算法---递归及尾递归

什么叫递归?举个例子,我们排队,想知道自己排在第几个,那么我们可以问前面的那个人,前面的人继续问前面,直到问到第一个人,这就是传递的过程。然后再从第一个人回来,这就是归(回溯)的过程。传递过去再回归回来,这就是递归。第一个人就是我们所说的递归出口,也就是说到哪个点应该回归了,如果没有出口,那么就会死 ... »