- 博客(21)
- 资源 (1)
- 收藏
- 关注
原创 CyclicBarrier和CountDownLatch的用法与区别
它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。每当一个线程完成了自己的任务后,计数器的值就会减1。CountDownLatch是计数器,线程完成一个记录一个,只不过计数不是递增而是递减,而CyclicBarrier更像是一个阀门,需要所有线程都到达,阀门才能打开,然后继续执行。对于CountDownLatch来说,重点是“一个线程(多个线程)等待”,而其他的N个线程在完成“某件事情”之后,可以终止,也可以等待。
2024-02-02 13:43:49
531
原创 记一次生产OOM的排查过程
由于heapdump.hprof是乱码文件我们不能直接打开,我们可以自行百度搜索对应的工具,我是使用的一款在线工具。根据日志的信息查找到对应的代码发现是自定义的过滤器导致,我们查看代码发现是过滤器执行放过的流程,此时并不能定位具体的原因。发现此段代码是导致内存溢出的主要原因,此处查询返回大量的数据导致,只需根据业务要求优化此处代码即可。此时我们只需逐步去分析内存占用最高的几个类的详情逐步分析,可以查看到具体的执行服务(方法代码)此时我们只需要去查询对应的代码就可以,发现接口是用于批量任务使用的。
2023-04-21 18:23:54
275
原创 Jackrabbit-webdav 开发webdev
最近由于客户提供了一个webdev的存储希望通过该存储进行文件的上传和下载,最近调研了下Jackrabbit-webdav调用nextcloud提供的服务,发现apache网站也没有给出明确的调用example,而网上大部分的example是基于1.6.5的,结合github上源码的tests内容加上自己的实践,简单的总结了一个jackrabbit-webdav-2.18.3的调用例子,供有需要的同学参考。
2022-10-19 11:52:46
967
2
原创 SpringBoot 启动时自动执行代码的几种方式
前言目前开发的SpringBoot项目在启动的时候需要预加载一些资源。而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在构造方法里实现,也可以使用@PostConstruct注解实现。当然也可以去实现Spring的ApplicationRunner与CommandLineRunner接口去实现启动后运行的功能。在这里整理一下,在这些位置执行的区别以及加载顺序。java自身的启动时加载方式static代码块static静态代
2022-05-24 13:22:07
1486
原创 吊打 ThreadLocal,谈谈FastThreadLocal为啥能这么快?
FastThreadLocal的引入背景和原理简介既然jdk已经有ThreadLocal,为何netty还要自己造个FastThreadLocal?FastThreadLocal快在哪里?这需要从jdk ThreadLocal的本身说起。如下图:在java线程中,每个线程都有一个ThreadLocalMap实例变量(如果不使用ThreadLocal,不会创建这个Map,一个线程第一次访问某个ThreadLocal变量时,才会创建)该Map是使用线性探测的方式解决hash冲突的问题,如果没
2022-05-18 22:08:13
147
原创 深入理解Synchronized
前言Synchronized想必大家在工作中一定有接触过,它算是Java并发场景下实现多线程安全一种比较直接的操作。有人会说它慢,确实。在JDK1.6之前,它有另一个名称叫做:重量级锁。但是从1.6版本起,它就在不断被优化。现如今已经是很成熟的并发安全技术;所以关于Synchronized的考察也常常成为面试官青睐的话题。本文我们会使用图解的方式解析Synchronized的使用和原理,让我们开始吧~对象锁和类锁什么是Synchronized?Synchronized是Java中的一个关
2022-05-17 12:30:54
468
原创 Vagrant环境的安装
1. 下载并安装virtualbox下载地址:https://www.virtualbox.org/wiki/Downloads安装过程很简单,傻瓜式的一步一步点下去。2.下载并安装vagrant下载地址:https://www.vagrantup.com/downloads.html安装过程依旧没什么难的,跟着提示一步一步next。3.安装检测4.新建目录:d:one5.cd 到该目录执行vagrant init 命令初始化6.编辑文件Vagrantfile.
2022-05-14 22:42:28
996
原创 SQL优化万能公式:5 大步骤 + 10 个案例
前言在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。SQL优化一般步骤 通过慢查日志等定位那些执行效率较低的SQL语句 explain 分析SQL的执行计划 需要重点关注type、rows、filtered、extra。 type由上至下,效率越来越高 Extra Using filesort:MySQL需要额外的一次
2022-04-21 13:12:57
160
原创 万字多图,搞懂 Nginx 高性能网络工作原理
在单进程的网络编程模型中。所有的网络相关的动作都是在一个进程里完成的,如监听 socket 的创建, bind、listen。再比如 epoll 的创建、要监听事件的添加,以及 epoll_wait 等待时间发生。这些统统都是在一个进程里搞定。一个客户端和使用了 epoll 的服务端的交互过程如下图所示。以下是其大概的代码示例(没耐心看的同学可以先)。intmain(){//监听lfd=socket(AF_INET,SOCK_STREAM,0);bind(lfd,......
2022-04-15 09:48:54
318
原创 select......for update 会锁表还是锁行?
select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁。那么它加的是行锁还是表锁,这就要看是不是用了索引/主键。没用索引/主键的话就是表锁,否则就是是行锁。验证:建表sql//id为主键//name为唯一索引CREATETABLE`user`(`id`INT(11)NOTNULLAUTO_INCREMENT,`name`VARCHAR(255)DEFAULTN...
2022-04-14 15:07:37
2518
1
原创 一文带你搭建 RocketMQ 源码调试环境
前言最近在倒腾 RocketMQ 消息队列,小卷了下 RocketMQ 的源码,本篇会带着大家一起看下如何配置好调试源码的环境。一、获取源码首先就是到 Github 网站上下载源码。源码地址:https://github.com/apache/rocketmq/releases我下载的是这个版本:rocketmq-rocketmq-all-4.9.2。如果遇到 Github 网站的打开速度较慢,可以在公众号后台回复RocketMQ源码即可获取百度网盘链接。二、导入源码下载..
2022-04-14 15:03:09
3055
2
原创 聊聊搜索引擎Elasticsearch
生活中的数据搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数据,如数据库,元数据等。非结构化数据:又可称为全文数据,不定长或无固定格式,不适于由数据库二维表来表现,包括所有格式的办公文档、XML、HTML、Word 文档,邮件,各类报表、图片和咅频、视频信息等。
2022-04-14 14:58:24
386
原创 建造者模式
模式的定义与特点建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。该模式的主要优点如下:封装性好,构建和表示分离。 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。 客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于
2022-03-14 22:15:47
139
原创 设计模式-工厂模式
工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。...
2022-03-14 14:01:08
574
原创 设计模式-原型模式
原型模式的定义与特点原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。原型模式的优点:Java自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。 可以使用深克隆方式保存对象的状态,.
2022-03-14 13:40:43
282
原创 java 设计模式之单例模式
单例模式单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费,或出现各个窗口显示内容的不一致等错误。单例模式有 3 个特点:单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点;单例模式的结构与实现单例模式是设计模式中最简单的模式之一。通常,普通类的构造函数是公有的,外部类可以通过“new 构
2022-03-14 10:26:57
841
原创 JAVA之七大设计原则
七大原则开闭原则里氏替换原则依赖倒转原则接口隔离原则迪米特法则合成复用原则单一职责原则设计原则总得来说还是为了让代码尽量的:高内聚、低耦合。提高代码的扩展性,复用性。实际开发中需要平衡开发效率与代码设计的量,设计模式使用过多类和方法细分会越多,导致过于臃肿1、开闭原则(Open Close Principle)定义:开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
2022-03-14 09:32:35
5550
原创 postgresql----表分区
表分区就是把逻辑上一个大表分割成物理上的多个小块,表分区可提供如下若干好处:1.某些类型的查询性能可以得到极大提升。2.更新的性能可以得到提升,因为表的每块索引要比整个数据机上的索引要小,如果索引不能全部放在内存里,那么在索引上的读写都会产生磁盘访问。3.批量删除可以用简单的删除某个分区4.将很少使用的数据移动到便宜的慢一些的存储介质上。示例创建主表create table tbl_inherits_test( a int, b timestamp with..
2022-03-10 12:19:09
2482
原创 Kafka入门经典教程
一、基本概念介绍Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。这个独特的设计是什么样的呢?首先让我们看几个基本的消息系统术语:Kafka将消息以topic为单位进行归纳。将向Kafka topic发布消息的程序成为producers.将预订topics并消费消息的程序成为consumer.Kafka以集群的方式运行,可以由一个或多个服务组成...
2018-07-13 15:56:12
399
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人