自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 JVM系列(4)——内存模型

4 内存模型主要参考:《JSR-133:Java内存模型与线程规范》;《Java Language Specification 16》的 17.4 章节 Memory Model。首先澄清运行时数据区和内存模型,这俩是完全不同的东西:运行时数据区:规定了 JVM 在使用内存时,应该将其分为几个部分,每个部分分别存储什么数据,有什么特性;内存模型:规定了在多线程场景下,程序以怎样的顺序执行是合法的。4.1 经典用例例一://共享变量x = 0, y = 0;//线程1执行i

2021-04-13 19:33:02 313 1

原创 JVM系列(3)——运行时数据区

文章目录3 运行时数据区3.1 各区域的作用3.1.1 虚拟机栈3.1.2 本地方法栈3.1.3 程序计数器3.1.4 堆3.1.5 方法区3.1.6 运行时常量池3.2 栈帧3.3 直接内存3.4 内存溢出3.4.1 堆 OutOfMemoryError3.4.2 方法区 OutOfMemoryError3.4.3 栈 OutOfMemoryError3.4.4 栈 StackOverflowError3.4.5 直接内存 OutOfMemoryError3 运行时数据

2021-03-29 22:19:31 281

原创 JVM系列(2)——字节码

2 字节码主要参考 《Java虚拟机规范(Java SE 8)》。这部分简单做个了解,有个大概印象。2.1 class 文件结构总览虽说是 class 文件,但其实字节码可以存在于任何地方,并不局限于 class 文件。当然,一般为了描述方便,统称为 class 文件。一个完整的 class 文件包括以下信息:magic:魔数,4 字节,固定为 0xCAFEBABE,咖啡宝贝,呼应 Java 的咖啡 logo。没啥用,表示这是一个 class 文件。minor_version:副版本号,

2021-03-26 03:39:55 187

原创 JVM系列(1)——概述

1 概述JVM 这块,总体而言,既简单,又复杂。简单是因为它的职责很明确,逻辑结构很清晰。复杂是因为一旦涉及具体实现,其中细节极多,而且知识点比较零碎,难以形成体系。1.1 什么是 JVM当我们在说 JVM 时,我们可能在说下面三种不同的东西:JVM 规范:抽象的规范,不具体指哪个 JVM 产品;JVM 实现:只要符合 JVM 规范的都可以算是正确的 JVM 实现,比如 HotSpot;JVM 实例:一个 JVM 进程。具体,要根据语境领会。类比://JVM 规范public i

2021-03-10 02:47:10 168

原创 Java并发系列(15)——synchronized之HotSpot源码解读(中)

上一篇:《Java并发系列(14)——synchronized之HotSpot源码解读(上)》文章目录10.5 轻量锁10.5.1 偏向锁升级轻量锁10.5.2 释放锁10.5.3 无锁直接加轻量锁10.5.4 重入10.5.5 mark word10.6 重量锁10.6.1 轻量锁升级重量锁10.6.2 示意图10.6.3 偏向锁升级重量锁10.6.4 直接加重量锁10.6.5 释放锁10.6.6 重入10.6.7 mark word10.5 轻量锁10.5.1 偏向锁

2020-12-16 22:41:04 297 1

原创 Java并发系列(14)——synchronized之HotSpot源码解读(上)

上一篇:《Java并发系列(13)——线程池的选择与参数设置》文章目录10 synchronized 实现原理10.1 研究思路10.1.1 输出 JVM 指令10.1.2 跟踪 JVM 源码10.2 预备知识10.2.1 对象头10.2.1.1 什么是对象头10.2.1.2 打印对象头10.2.1.3 小端存储10.2.2 用户态与内核态10.2.2.1 用户态与内核态10.2.2.2 用户线程与内核线程10.3 Hashtable 性能测试10.3.1 测试一10.3.2

2020-12-11 22:44:14 428 1

原创 Java并发系列(13)——线程池的选择与参数设置

接上一篇《Java并发系列(12)——ForkJoin框架源码解析》文章目录9.5 线程池的选择与参数设置9.5.1 JDK 预定义的线程池9.5.1.1 Executors#newCachedThreadPool9.5.1.2 Executors#newFixedThreadPool9.5.1.3 Executors#newScheduledThreadPool9.5.1.4 Executors#newSingleThreadExecutor9.5.1.5 Executors#newSin

2020-11-22 20:15:42 506 1

原创 Java并发系列(12)——ForkJoin框架源码解析

接上一篇《Java并发系列(11)——ThreadPoolExecutor实现原理与手写》文章目录9.4 ForkJoinPool9.4.1 demo9.4.2 初步认识9.4.3 工作线程状态9.4.4 位运算9.4.4.1 成员变量9.4.4.2 方法9.4.5 WorkQueue9.4.6 外部提交任务9.4.7 窃取任务9.4.8 执行父任务9.4.9 内部拆分任务9.4.9.1 不提交,直接 join9.4.9.2 不提交,直接 invoke9.4.9.3 subm

2020-11-09 21:29:22 1208 4

原创 Java并发系列(11)——ThreadPoolExecutor实现原理与手写

接上一篇《Java并发系列(10)——FutureTask 和 CompletionService》文章目录9 线程池9.1 JDK 线程池9.2 ThreadPoolExecutor9.2.1 参数9.2.1.1 corePoolSize,maximumPoolSize9.2.1.2 keepAliveTime,timeUnit9.2.1.3 workQueue9.2.1.4 threadFactory9.2.1.5 rejectExecutionHandler9.2.1.6 all

2020-10-19 12:43:01 275

原创 Java并发系列(10)——FutureTask 和 CompletionService

接上一篇《Java并发系列(9)——并发工具类》文章目录8 FutureTask 与 CompletionService8.1 FutureTask8.1.1 类图8.1.2 几个问题8.1.3 实现细节8.1.3.1 属性8.1.3.2 run 方法8.1.3.3 get 方法8.1.3.4 cancel 方法8.1.3.5 七种状态汇总8.1.3.6 isCancelled 方法8.1.3.7 isDone 方法8.2 CompletionService8.2.1 接口方

2020-10-17 21:13:17 290 2

原创 Java并发系列(9)——并发工具类

接上一篇《Java并发系列(8)——并发容器》文章目录7 并发工具类7.1 Semaphore7.1.1 核心方法7.1.2 demo7.1.3 注意点7.1.4 手写7.2 Exchanger7.2.1 核心方法7.2.2 demo7.2.3 注意点7.2.4 手写7.3 CountDownLatch7.3.1 核心方法7.3.2 demo7.3.3 注意点7.3.4 手写7.4 CyclicBarrier7.4.1 核心方法7.4.2 demo7.4.3 注意点

2020-09-15 01:50:20 203

原创 Java并发系列(8)——并发容器

接上一篇《Java并发系列(7)——AQS与显式锁实现原理》文章目录6 并发容器6.1 并发 HashMap6.1.1 HashTable6.1.2 ConcurrentHashMap6.1.2.1 jdk1.7 的实现6.1.2.1.1 数据结构6.1.2.1.2 构造方法6.1.2.1.3 get6.1.2.1.4 put6.1.2.1.5 remove6.1.2.1.6 rehash6.1.2.1.7 isEmpty6.1.2.1.8 size6.1.2.1.9 cont

2020-09-06 00:08:25 359

原创 Java并发系列(7)——AQS与显式锁实现原理

接上一篇《Java并发系列(6)——AQS与显式锁的使用》文章目录5.4 AQS 实现原理5.4.1 原理图5.4.1.1 数据结构5.4.1.2 AQS 如何管理线程5.4.1.3 AQS 是公平锁还是非公平锁5.4.2 核心源码5.4.2.1 acquire 方法5.4.2.2 release 方法5.4.2.3 acquireShared 方法5.4.2.4 releaseShared 方法5.4.2.5 await 方法5.4.2.6 signal 方法5.4.2.7 s

2020-07-24 20:20:51 325

原创 Java并发系列(6)——AQS与显式锁的使用

接上一篇《Java并发系列(5)——CAS与Java原子操作类》文章目录5 AQS 与显式锁5.1 显式锁5.1.1 ReentrantLock5.1.2 Condition5.1.3 公平锁与非公平锁5.1.4 synchronized 与显式锁对比5.1.5 ReentrantReadWriteLock5.2 AQS5.2.1 什么是 AQS5.2.2 为什么需要 AQS5.2.3 AQS 负责做什么5.3 AQS 快速上手5.3.1 基于 AQS 实现 Lock5.3.2

2020-07-20 01:44:09 283 3

原创 Java并发系列(5)——CAS与Java原子操作类

接上一篇《Java并发系列(4)——ThreadLocal实现原理与内存泄漏分析》文章目录4 CAS4.1 什么是 CAS4.2 CAS 的作用4.3 问题与解决办法4.3.1 CAS 只保证原子性,不保证可见性4.3.2 ABA 问题4.3.3 对于耗时操作的开销问题4.3.4 CAS 只能操作一个变量4.4 Unsafe 类4.4.1 获取 Unsafe 实例4.4.2 调用 Unsafe 方法4.5 JDK 原子操作类4.5.1 基本类型原子类4.5.1.1 使用示例4.

2020-07-10 21:53:14 256

原创 Java并发系列(4)——ThreadLocal实现原理与内存泄漏分析

接上一篇《java并发系列(3)——线程协作:wait,notify,join》文章目录3 ThreadLocal3.1 作用3.1.1 线程隔离3.1.2 线程上下文变量3.2 ThreadLocal 常用方法3.2.1 set,get3.2.2 remove3.2.3 初始值3.2 实现原理3.2.1 数据存储结构3.2.2 源码3.2.2.1 ThreadLocalMap3.2.2.2 ThreadLocal#set 方法3.2.2.3 ThreadLocal#get 方

2020-07-04 04:15:25 277

原创 手写 ThreadLocal

这是一个简易版的 ThreadLocal,实现了 ThreadLocal 的 set,get,及 remove 方法。

2020-07-04 03:59:40 378 1

原创 java并发系列(3)——线程协作:wait,notify,join

内容包括:wait 和 notify的使用;wait 和 notify 时线程做了哪些事情;对比了 wait 和 sleep 的异同;对比了 wait 导致的阻塞和 sleep,synchronized 导致的阻塞的异同;分析了 join 的代码实现。

2020-06-26 12:42:23 245

原创 利用wait/notify模拟消息队列

利用 wait/notify 模拟消息队列一个简易版的消息队列模型:这里一共有四种角色:queue:消息队列;Publisher:消息发布者,可以向任何一个队列发布消息;Listener:消息监听者,一个 Listener 同时只能监听一个 queue 的消息;但一个 queue 可同时被多个 Listener 监听;MqServer:消息队列服务器,负责管理所有的队列。首先定义 MqServer,queue 都在 MqServer 里面:package per.lvjc.concur

2020-06-26 12:12:15 365

原创 java并发系列(2)——线程共享,synchronized与volatile

接上一篇《java并发系列(1)——基本概念与Thread API》2.3 线程共享多个线程并发访问共享资源时,有可能产生线程安全问题。线程安全包括三个方面:原子性、可见性、有序性,也可以说是并发三大特性。2.3.1 cpu 缓存模型2.3.1.1 背景cpu 的运算是在一个容量较小但读写速度很快的寄存器上进行的,而数据是存储在计算机物理内存(主存)的。所以 cpu 需要从内存读取数据到寄存器进行运算,然后再把数据更新到内存。随着技术发展,cpu 运算速度飞速提升,而内存访问速度一直没有

2020-06-24 12:58:36 235

原创 java并发系列(1)——基本概念与Thread API

主要内容包括:并发相关基本概念,Java Thread 相关基本 API,及其对线程生命周期的影响。

2020-06-18 21:14:39 253

原创 让Thread#stop方法无法终止你的线程

众所周知,Thread 类有一个 stop 方法,可以用来终止线程。当然,这个方法连同 suspend,resume 方法一起都已经被弃用了。原因是 stop 方法终止线程过于暴力,不管被 stop 的线程在干什么,一旦被 stop 它就得立刻停止执行,然后释放锁,这是非常不安全的。那么,有没有办法,让被 stop 的线程继续执行,并且不释放锁呢?我写了一段代码,各位可以拿去试试:package per.lvjc.concurrent.stop;public class CanNotStopThr

2020-06-16 01:21:01 1315

原创 rabbitmq:publisher confirms

0.背景最近在我们的业务系统中遇到一个问题,publisher行为:convertAndSend然后打日志。consumer行为:@RabbitListener接到消息立刻打日志。问题是,publisher打出了发送消息的日志,consumer没打出收到消息的日志。基于这种情况,准备启用rabbitmq java client的ReturnCallback及ConfirmCallback...

2019-06-21 20:20:55 6495 2

原创 利用 docker hub 拉取 gcr 镜像

参考官网:https://docs.docker.com/docker-hub/背景:kubernetes需要用到gcr中的镜像,而国内因为网络问题无法从gcr拉取镜像。原理:无法从国内拉取gcr镜像,那就找一个既能拉取gcr镜像,又能被国内访问到的地方,从那里去拉gcr镜像。类似于代理,而docker hub是一个现成的从国内不需要代理就能访问,也能拉取gcr镜像的地方。因为docke...

2019-06-13 23:18:26 898 1

原创 kubernetes集群部署(四):部署heapster+influxdb

在上一篇《kubernetes集群部署(三):部署dashboard服务》中,我们部署了dashboard,但这个dashboard页面看上去好像少了点什么,没有cup和内存使用监控图表。dashboard在github(https://github.com/kubernetes/dashboard)上说的很清楚:Heapster has to be running in the clust...

2019-03-28 02:00:00 392

原创 kubernetes集群部署(三):部署dashboard服务

dashboard本身就是一个部署在k8s集群中的服务,像其它服务一样部署既可。下载yaml文件wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml修改deploy部分 ... spec: ...

2019-03-27 01:14:35 386

原创 kubernetes踩坑:nodePort拒绝访问的问题

(1)找到pod所在节点,从pod所在k8s节点上通过{nodeIp}:{nodePort}访问,如果访问不了,可能是pod或service没有成功部署;(2)从其它node节点通过{nodeIp}:{nodePort}访问,如果不能访问,执行kubectl describe pod {podName} -n={namespace}查看pod描述信息,找到pod ip,直接对着pod访问{...

2019-03-26 21:31:49 23531 8

原创 kubernetes集群部署(二):安装flannel网络组件

按照《kubernetes集群部署(一):二进制方法部署》的安装步骤,到目前为止,k8s已经能正常调度pod,但访问上还存在问题:k8s不同节点之间的pod网络是不能互通的,即,只能访问被分配到当前节点上的pod。可以安装flannel组件以解决这个问题。集群中每一个节点(master和node)都需要安装flannel。flannel以etcd作为数据库。1.确保当前节点能访问etcd如...

2019-03-26 19:04:38 1118

原创 kubernetes集群部署(一):v1.13二进制文件部署

说明:kubernetes版本为1.13.1,所有节点操作系统均为centos 7。参考:《kubernetes权威指南》1 安装(二进制文件方式)因为google的原因,kubeadm方式安装总是出现各种问题,故而决定采用二进制文件的方式自己动手安装。1.1 安装dockerMaster和Node上都需部署docker服务。安装docker,部署私有image仓库,参考 docker...

2019-01-06 15:37:16 3148 2

原创 docker私有化仓库部署及dockerfile示例

1. 安装# 安装yum install -y docker# 开机自启systemctl enable docker# 启动systemctl start docker2. 部署私有化docker仓库参考官方文档 https://docs.docker.com/registry/下载registry镜像docker pull registry:2准备证书(目的是能被网络...

2018-12-25 22:44:43 851

原创 centos yum问题:cannot find a valid baseurl for repo的原因及解决方案

1.问题出现的场景将VirtualBox创建的虚拟机ip分配方式由DHCP改为static,改完后使用yum命令时出现此问题。2.原因先在网上搜索了别人的解决方案,大都说将配置文件/etc/sysconfig/network-scripts/ifcfg-{网卡名称}里面的ONBOOT="no"改为yes,但我这里它原本就是yes,所以显然没有抓住问题的本质。那么检查一下网络是否可用,尝试从...

2018-12-22 04:14:27 2564

原创 spring-rabbit消费过程解析及AcknowledgeMode选择

2018-12-19 23:17:32 16722 5

原创 elasticsearch源码:ping的发送与处理过程

一个节点通过向其它节点发送ping请求来发现其它节点的存在。这里只讨论在新节点启动时发送的ping请求。代码入口从UnicastZenPing类的ping方法入手: /** * a variant of {@link #ping(Consumer, TimeValue)}, but allows separating the scheduling duration ...

2018-11-26 22:12:54 1514

原创 elasticsearch源码:unicast列表解析

现在es的集群发现用的是unicast模式,所以要将新节点加入集群,需要配置unicast节点地址列表,也就是discovery.zen.ping.unicast.hosts,默认值是本机,除非要将集群部署在同一台机器上,否则必须配置。下面进入源码看一下读取unicast节点列表的具体过程。入口在UnicastZenPing类的下面这个方法里面: /** * a varian...

2018-11-26 21:32:39 672

原创 Spring整合rabbitmq实践(三):源码-@RabbitListener实现过程

4. 源码解析4.1. 通过RabbitTemplate获取消息从RabbitTemplate中只有queueName入参的方法开始: @Override public Message receive(String queueName) { if (this.receiveTimeout == 0) { return doReceiveNoWait(queueName);...

2018-11-19 19:36:38 11724

原创 Spring整合rabbitmq实践(二):扩展功能

3. 扩展实践3.1. MessageConverter前面提到只要在RabbitTemplate中配置了MessageConverter,在发送和接收消息的时候就能自动完成Message和自定义java对象的自动转换。MessageConverter接口只有两个方法:public interface MessageConverter {/*** Convert a Java o...

2018-11-19 19:31:12 3784

原创 Spring整合rabbitmq实践(一):基础使用配置

1. Rabbitmq基本概念1.1. Rabbitmq中的各个角色producer:消息生产者;consumer:消息消费者;queue:消息队列;exchange:接收producer发送的消息按照binding规则转发给相应的queue;binding:exchange与queue之间的关系;virtualHost:每个virtualHost持有自己的exchange、que...

2018-11-19 19:22:17 19888

原创 从elasticsearch源码看节点启动流程

本文尝试通过阅读源码的途径,了解elasticsearch节点启动的大体流程。1. 读取配置创建运行环境运行环境,这里指的是Environment对象,这个对象封装了Settings对象(es配置),data路径,plugins路径,modules路径,bin路径,libs路径,log路径等。相关源码: /** Create an {@link Environment} for th...

2018-11-19 19:15:05 636

原创 elasticsearch源码运行调试的问题

由于官方文档对es原理方面的讲解非常少,所以如果时间允许可以自己下载源码在本地调试。首先在github上可以下载到各个版本的源码,写作本文时最新的是6.4.2版本:https://github.com/elastic/elasticsearch/tree/v6.4.2下载的源码是gradle项目,所以需要安装gradle,对版本有要求,我用的是4.10.2版本。对java的版本也有要求,我用...

2018-11-19 19:11:45 2070

原创 Elasticsearch插件x-pack的安装使用

学习Elasticsearch的时候在《Elasticsearch权威指南》(https://es.xiaoleilu.com/010_Intro/10_Installing_ES.html)上看到一个叫marvel的监控插件,本想安装试试,然后发现似乎现在已经被整合到x-pack里面去了。官方文档原话是这么说的,“X-Pack is an Elastic Stack extension th...

2018-07-18 16:50:15 1210

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除