
java
文章平均质量分 88
码农Ralap
这个作者很懒,什么都没留下…
展开
-
java多线程之间数据通信
线程数据通信使用共享变量/对象父子线程通信Exchanger管道我们知道Java每个线程之间是数据隔离的,那在多线程环境下,两个线程之间,如何进行数据传输呢下面我们以main线程中新起一个子线程的方式,来模拟两个线程之间数据通信的场景。使用共享变量/对象 private static String name = "张三"; public static void main(String[] args) { System.out.println("主线程:name :" +原创 2021-02-09 17:46:38 · 723 阅读 · 1 评论 -
Java 代码如何支持多路复用
多路复用原创 2021-02-07 20:21:40 · 1083 阅读 · 3 评论 -
网络IO模型
TCP实际操作演示通信三次握手连接唯一性BackLog,TimeOut实际操作演示这章介绍下TCP网络通讯协议的工作原理。首先我们使用Java代码编写一个service端和一个client端,让两者建立通讯。注:使用环境适用于Linux/Unix环境我们先来看下Service端:我们再Service端定义一个9091端口,新建一个ServerSocket并且绑定9091端口。下面我们将Service 运行起来:现在我们已经在shell中将service run起来了,端口号是9091。请原创 2021-01-19 10:36:30 · 308 阅读 · 0 评论 -
Java NIO模型
NIOBIO问题NIOBIO问题通过前面两个章节的介绍,相信大家已经对网络BIO模型已经有了不少了解了。那么BIO主要的问题点在哪里呢?我们来回顾下BIO模型的架构图:client与service经历三次握手之后,service在内核中开辟空间,分配FD,socket主线程bind到该FD后,clone出子线程来接收client传输的数据以及业务处理。如果简单的使用此模型,我们可以看到每一次接收到client连接,都需要创建出新线程,而我们也知道计算机创建新线程的代价是很大的,内存分配(每个线程约原创 2021-01-24 19:50:05 · 516 阅读 · 1 评论 -
Java BIO模型
网络IOBIO前面我们简单介绍了网络之间是service和client是如何建立通信的,这次我们来看下两方是如何交换数据的。使用的service和client代码和前一章一样。BIO首先我们先来看下基础的网络BIO模型是如何运作的,为了讲解清楚过程,我们还是以实际运行结果展示。注:环境以mac os 10.14.6位基础,部分命令以及展示结果与Linux会有不同,不过基本上大同小异。我们这次在service运行时,追踪一下service进程的系统调用情况:还记得我们Service中的代码逻辑原创 2021-01-23 17:05:34 · 257 阅读 · 0 评论 -
文件IO
文件IO文件读取文件加载虚拟目录:文件描述符(FD)一切皆文件文件IOpageCahcedirty刷盘LRUbufferfile NIO在计算机中,IO有很多种,常见的文件IO,网络IO,我们常用的鼠标键盘这些也都是IO设备。今天主要介绍下文件IO文件读取先简单看下我们的应用是怎么读取到文件的:在我们的内存中,主要被分为了两块区域,一块OS内核的专有内存,另外一块是我们运行的其他程序的内存。文件的读与写,都是由kernel统一管理,针对文件这块,kernel会对文件虚拟出一个文件目录树,当需要读原创 2021-01-17 23:16:28 · 203 阅读 · 1 评论 -
java 常见GC
GC常见GCSerialSerial oldParallel Scavenge(PS)Parallel old(PO)ParNewCMS(concurrent mark sweep)G1RegionYoung GCMixed GCFull GCZGC概念并行并发card tableCSet(Collection Set)RSet(Remembered Set)GC和内存容量常见GCSerial随着JDK诞生,使用的垃圾回收器就是Serial这是一种单线程垃圾回收器,串行工作那么它是如何工作的呢?原创 2021-01-10 21:35:34 · 1054 阅读 · 0 评论 -
Java GC - 分代
GC-分代垃圾对象识别垃圾引用计数(reference count)可达性分析(root searching)root节点垃圾清除标记清除拷贝标记-压缩GC种类内存分代对象生命流转垃圾对象在Java里面,什么样的对象,是垃圾对象呢?通俗来讲,就是没有任何引用指向的对象,即为垃圾对象,在内存中占着空间,但是没有任何引用会引用到它。Java中有专门的GC(垃圾收集器)来处理垃圾,一般情况下,开发人员不需要特别关注垃圾对象的处理。识别垃圾现在清楚了什么是垃圾对象,那GC又是如何判断这个对象是否是垃圾呢?原创 2021-01-10 02:13:50 · 317 阅读 · 0 评论 -
RockmetMQ消息持久化
消息存储零拷贝文件存储零拷贝RockmetMQ的持久化,是基于文件系统的,采用零拷贝技术文件存储我们进入一个Broker,查看其内部是如何进行文件存储的。主要有以下几个文件:commitlog,config,consumequeue,indexcommitlog:存放每一条消息的消息实际内容,因采用零拷贝技术,其大小是由限制的,一般默认是1G。采用append方式,存储的每一条之间是无序的。如上图,有两个Producer,共产生6条消息,在commitlog中,6条消息的先后存储顺序是随机的原创 2020-11-19 19:54:03 · 167 阅读 · 0 评论 -
RocketMQ 拉取消息
start在上面的start章节,我们从源码中可以看到这么一行代码:原创 2020-10-25 20:49:05 · 1781 阅读 · 0 评论 -
MySQL 调优之执行计划
执行计划概述idselect_typetabletypepossible_keyskeykey_lenrefrowsextra概述当我们写完了一条SQL语句给数据库执行,那数据库是如何执行的呢?这就涉及到SQL的执行计划了。现有需求:我们需要查看一年级有哪些学生:select * from student s join greade g on s.class=g.greadeCode where g.greadeCode =1;如何查看上面这条SQL的执行计划呢?很简单,加上explain命令原创 2020-06-07 20:00:09 · 424 阅读 · 0 评论 -
MySQL 调优之性能监控
性能监控MySQL基本架构:show profileperformance schemaMySQL基本架构:想要了解SQL的性能,我们需要先了解下MySQL是如何玩起来的:连接器:负责跟客户端建立连接,获取权限,维持和管理连接,包括用户名密码验证,权限的查询与分配,自动断开连接等,可分为长连接和短连接。查询缓存:当执行查询语句的时候,先去查询缓存中的数据,如果能找到结果则直接返回,如果没有,再去数据库中进行查询。如果数据更新比较频繁,只要表更新,缓存就会被清空,此时不建议使用缓存,命中率会比较低原创 2020-06-07 15:35:54 · 445 阅读 · 0 评论 -
分布式事务
分布式事务两段式提交(2PC)三段式提交(3PC)3PC vs 2PC基于消息的一致性假设现在客人下单成功了,我们需要落订单信息,调整库存信息,落订单快照信息等多项操作,但是这些信息在不同的数据库集群中,如何通过事务保证数据准确呢?两段式提交(2PC)何为两段式提交?两段式提交,即为通过一个中间者TM来协调所有数据库的动作,TM先发送预提交指令(第一阶段),再发送提交/回滚指令(第二阶段)具体过程如下:client提交事务请求到TMTM向每个数据库发送可以提交指令每个数据库处理自己的数据(增原创 2020-05-31 15:42:12 · 191 阅读 · 0 评论 -
分布式锁
分布式锁锁线程锁分布式锁Redis实现分布式锁简单讲述下Redis为什么可以做分布式锁:锁线程锁相信大家在写代码中遇到多线程有资源竞争关系时,第一反应是加锁,Synchronized,Lock,这种属于线程锁,只在单个JVM中有效。如果在分布式系统中又是个什么情况呢?分布式锁现在假设有这样一种场景,有3台服务器组成一个集群,有一个商品,库存数量为1。现在有6个客人都想购买这个商品,假设他们同时都发送预定请求。假设现在6个请求同时到达各自的服务器,同时假设每台服务器的每个线程处理速度一致,则6个原创 2020-05-29 20:34:03 · 185 阅读 · 0 评论 -
JVM之JMM
JMM内存分布MarkWord运行时数据区栈帧Frame在上面的Class加载章节中,我们讲解了JVM是如何将Class文件加载进内存的。那当我们对这个Class进行实例化之后,JVM又是如何处理这个实例化对象的呢?我们今天来了解下Java的内存模型JMM内存分布当我们在代码中写完 T t = new T(),我们知道这是这是将Class T实例化了一个t对象,那这个t对象,在内存中是如何体现的呢?主要分为普通对象和数组对象,差别不大,我们先看下普通对象的内存分布情况:实例化的普通对象t的组成主原创 2020-05-24 15:16:58 · 347 阅读 · 0 评论 -
硬件级多线程保障
硬件与多线程存储结构图数据一致性总线锁缓存一致性协议缓存行对齐小demoWCBuffer(write combining buffer)CPU乱序执行CPU 内存屏障JVM内存屏障存储结构图对于现代CPU,广告中我们经常可以听到一个三级缓存的概念。其中第一级和第二级缓存,为每个CPU核心独享,第三级缓存,是所有CPU核心共享,缓存集成在CPU内部,读取写入速度非常快,但是容量很小再往下一级便是我们的内存,容量大,读写速度相对较快,再往下便是我们的磁盘, 容量可以非常大,但是读写速度比较一般。那整原创 2020-05-21 20:43:16 · 1041 阅读 · 1 评论 -
JVM之Class加载
Class Load我们编译后的.class文件是如何被JVM加载进入内存的呢,中间经过了哪些个步骤呢?如下图:主要是经过这么几个步骤:loading加载linking- verifiy验证阶段- prepare准备阶段- resolute解析阶段初始化...原创 2020-05-18 12:57:20 · 338 阅读 · 0 评论 -
JVM之Class文件
ClassLoader我们先看下我们的代码是如何在JVM层面跑起来:原创 2020-05-12 13:35:51 · 190 阅读 · 0 评论 -
读懂Java线程池
线程池Java容器线程池Executor、Future、FutureTaskExecutorFutureFutureTaskThreadPoolExecutor执行过程实现原理线程复用Java容器在Java中,容器共有2大类,一种是Collection,另一种是map。其中Collection下又有2中集合类型,一种是普通存储数据类的list以及set,还有一种是为高并发服务的queue。为...原创 2020-05-05 16:04:14 · 688 阅读 · 0 评论 -
java多线程之volatile
volatile线程间数据一致性可见性指令重排线程间数据一致性问题引述:当前有两个线程,线程1和线程2,在各自的工作内存中,持有堆内存flag对象的副本。如何保证两个线程中flag对象是一致的呢,避免出现类似线程1中flag=1,线程2中flag=2的情况。可见性如何解决上面的问题呢?我们首先得知道下线程的工作原理。线程将数据从主内存copy进自己的工作内存之后,后续的读写操作,实际操...原创 2020-05-02 15:07:31 · 278 阅读 · 0 评论 -
Redis简介一(单机版)
发展历程1.0阶段2.0阶段3.0阶段Redis1.0阶段常见文件存储有两种方式:磁盘,内存。涉及到两种常见问题:寻址,带宽。磁盘寻址在毫秒(ms)级,带宽 xx G内存寻址在纳秒(ns)级,带宽:很大磁盘与内存,在寻址方面,慢了10w倍磁盘有磁道,扇区。一个扇区512byte,容量很小,带来一个问题,当文件比较大的时候,需要不停的访问扇区,不停寻址,对应的文件索引也会非常庞大。内...原创 2020-03-31 19:59:47 · 682 阅读 · 1 评论 -
Spring Boot启动原理解析
SpringBoot一般启动方式main方法中:SpringApplication.run(XXX.class, args);runSpringApplication的静态方法提供了哪些服务呢?源码如下: /** * Static helper that can be used to run a {@link SpringApplication} from the * speci...原创 2020-03-21 02:05:07 · 636 阅读 · 3 评论 -
JMockit在工作中的实战
JMockit的简单使用介绍引入JMockitAPIMockUpExpectations功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导...原创 2020-03-18 23:20:39 · 408 阅读 · 1 评论