自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

林锦佳的博客

把摸鱼的时间用来学习。

  • 博客(57)
  • 收藏
  • 关注

原创 Java 并发 ThreadLocal 详解

ThreadLocal 即线程本地变量的意思,常被用来处理线程安全问题。ThreadLocal 的作用是为多线程中的每一个线程都创建一个线程自身才能用的实例对象,通过线程隔离的方式保证了实例对象的使用安全。在并发编程中,有以下几种方式可以用来避免线程安全问题同步方案加锁(synchronized 和 Lock)通过 CAS (原子类)无同步方案栈封闭(方法的局部变量)本地存储(ThreadLocal)

2023-08-31 12:47:42 188

原创 Java 并发 线程基础

一个进程可以包含多个线程,而多个线程共享进程的资源,并且还有自己的上下文环境。线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。级,优先级越高的线程拥有更高的几率执行,因为线程的优先级只是提供了相对的调度顺序,具体还是要看操作系统的调度算法和策略影响。当多个线程同时在处理某一个问题时,需要协调各个线程之间的工作,否则容易产生线程安全问题。阻塞和等待的区别在于阻塞是被动的,它在等待一个排他锁,而等待是主动的。

2023-08-31 12:46:29 107

原创 Java SPI 机制

SPI (Service Provider Interface)是 Java 内置的一种服务提供发现机制,将功能的实现交给第三方,用来拓展和替换组件。SPI 的核心思想是解耦,将接口的定义和实现分开两部分处理。接口的调用方负责定义接口,而实现则由第三方去实现。SPI 机制允许将功能的实现抽离出原本的模块,在模块化设计中颇为受用。当服务的提供者实现了一种接口之后,需要在自己的 classpath 下的目录新建一个文件,文件名是接口的名称,内容是接口的实现类的全限定名称,每个实现类占一行。

2023-08-31 12:38:19 110

原创 Java 注解机制

Java 注解(Annotation)又称 Java 标注,是 JDK 1.5引入的一种注释机制。注解可以用来标注程序中的类、字段、变量、参数等。注解只是一种注释、标记作用,注解插入到代码中,进而可以达到影响代码运行逻辑的效果,比如可以动态切换数据源、拼接SQL语句、标记接口白名单等。当然,这些效果都是基于自定义注解完成的,需要我们对注解有一个很好的认识,才能使用注解来帮助我们减少重复性代码的开发。在 Java 中,注解是当作一种修饰符来使用的,它被置于被注释项之前,中间没有分号。Java 注解是通过。

2023-08-31 12:37:08 89

原创 Java 反射机制

在我平时的使用中,Java 的反射包括两个方面,一是在运行状态中,动态获取类的信息;一是在运行状态中,动态调用对象的方法。动态获取类的信息就是对于任意一个类,都能获取到这个类的字段、方法、注解相关的信息。动态调用对象的方法指的是对于任意一个对象,通过反射能调用它的任意方法。反射强大而复杂。平时的业务开发用的比较少,但是框架、工具构造的时候用的比较多。因此学习反射可以帮助我们更好的看懂框架的源码。

2023-08-31 12:36:15 33

原创 Java 异常机制

异常是程序中的一些错误,有时候错误是无法避免的,有些错误是用户引起的,有些错误是程序引起的,所以需要一套异常处理机制来处理这些错误。

2023-08-31 12:34:45 44

原创 Java 泛型机制

Java 在 JDK 1.5 的时候引入了泛型( generic ),泛型,同时编译器还加入了机制,可以在编译时发现与泛型声明类型不符合的问题。Java 泛型的本质是,即所操作的数据类型被指定为一个参数。

2023-08-31 12:33:42 30

原创 Kafka系列七存储机制

Kafka 在设计之初就将数据的持久化视为通常情况,关注点放在了吞吐量而不是功能。Kafka 采取简单的读取和内容附加到日志文件中,这种操作的好处是读写都是O1的复杂度,而且读取不影响写入操作。除此之外,数据量的大小对性能几乎没有影响,对于过期的数据也能采取简单方式删除。Kafka 之所以采用这种读写方式,是因为对磁盘的线性读写比随机读写的性能要快得多,磁盘的线性读在有些情况下甚至比内存的随机访问要快。

2023-08-31 12:25:40 54

原创 Kafka系列六集群管理

在这种模式下,对于 f+1 个副本,一个 Kafka topic 能在保证不丢失已经 commit 消息的前提下容忍 f 个副本的失败,在大多数使用场景下,这种模式是十分有利的。事实上,为了容忍 f 个副本的失败,“少数服从多数”的方式和 ISR 在 commit 前需要等待的副本的数量是一样的,但是 ISR 需要的总的副本的个数几乎是“少数服从多数”的方式的一半。为了保证集群的高可用性,Kafka 的分区可以设置为多副本的,这样在某个副本丢失的情况下,可以从其他的副本中获取信息。

2023-08-31 12:24:51 66

原创 Kafka系列五消费者

与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,从主题中拉取消息。使用 KafkaConsumer 之前需要先理解消费者和消费者组的概念。

2023-08-31 12:24:08 218

原创 Kafka系列四生产者

如果要按照自身的需要去设计分区逻辑,可以自定义一个分区器,只需要实现 Partitioner 接口,然后在启动的时候,指定对应的分区器即可。props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, "自定义分区器的全限定名");

2023-08-31 12:22:53 109

原创 Kafka系列三基础概念

Kafka 是一款分布式消息发布和订阅系统,其高性能、高吞吐量的特点决定了其适用于大数据传输场景。

2023-08-31 12:20:37 45

原创 Kafka系列二消息队列的选择

了解完消息队列的基本信息之后,接下来我们可以考虑消息队列的技术选型问题。目前使用较多的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ 等,以及数据库Redis 也可以实现消息队列的效果。实际使用中应该使用哪一种呢?解析来我们看一看主流消息队列的特性。

2023-08-31 12:17:13 52

原创 Kafka系列一消息队列

消息队列是分布式系统中的重要组件,也是Java开发中常用的技术点之一。使用消息队列可以解决模块间的解耦、流量削峰、异步消息,提高系统的可用性、稳定性以及性能。

2023-08-31 12:07:56 84

原创 使用插件推荐 Key Promoter X

IntelliJ IDEA 是一款功能强大的 IDE,但是由于其功能的复杂性,很多时候我们可能会不知道该如何使用某些功能和对应的快捷键。为了解决这个问题,我们可以使用 Key Promoter X 插件来帮助我们更好地使用 IntelliJ IDEA。是一款免费的 IntelliJ IDEA 插件,它可以在你使用鼠标执行某个操作时提醒你是否有相应的快捷键可以代替鼠标操作。如果你经常使用鼠标操作而不使用快捷键,那么 Key Promoter X 就是为你设计的。

2023-03-24 14:38:57 1587 1

原创 实用插件推荐 CodeGlance Pro

Code Glance Pro 是一个用于在侧边栏展示文件整体内容的插件,类似于 Sublime 中的 minimap。通过它可以快速在文件的头部、尾部、中间部分进行跳转。

2023-03-22 15:44:23 4550 2

原创 实用插件推荐 Show Comment

最近发现一款不错的 IDEA 插件 Show Comment,可以辅助显示代码注释。它能在左侧的目录树显示每个文件的类注释,也能在代码中显示每一行的代码注释,前提是你这一行的字段或者方法已经写过注释了。但是要想插件生效的话,写注释的时候要注意使用 Javadoc 规范,见过有些小伙伴喜欢给类的字段写行尾注释,这样 IDEA 读取不到这个字段的注释。

2023-03-21 11:28:52 564 3

原创 禁用非必需插件,让 IDEA 飞起

IDEA 为我们提供了众多的插件,但是这些插件并不都是必须的。如果电脑的性能不够强,反而会带来一些不必要的资源消耗。因此这里整理了一些不常用的插件,可以通过禁用它们来缓解 IDEA 的运行压力。禁用之前需要注意!!!如果禁用哪个插件导致软件不能正常运行,可以尝试重启 IED 看是否能解决。

2023-03-17 17:01:38 11923 7

原创 我的第一个 Intellij 插件上线了

Simple Deployment 是我借鉴 Alibaba Cloud Toolkit 插件开发的一个方便自己在开发过程中部署服务的插件。

2022-07-01 09:23:31 718 1

原创 java生成word文档

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech前言Java 要生成 word 文档,可以借助 freemarker 引擎生成。可能很多人不知道,Word 其实可以导出为 xml 文件,而 xml 文件又可以很轻松的转换为 ftl 文件,只需改个后缀名。ftl 是 freemarker 文件的后缀,其内容格式与 xml 没太大差别。而且 freemarker 是一个模版引擎,有自己的语法但是不复杂,非常适合用来生成 html 或者 xml。Freemarker 手

2021-12-21 15:29:05 1314 1

原创 git 搭建私人仓库以及优化流程

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech以下操作都是通过 root 用户进行的。首先要确保服务器上面有 git。如果没有,可以通过 yum install git 进行安装。安装完之后创建一个 git 的用户和用户组(-G 参数自动创建用户组 git),并且指定使用的 shell。useradd -s /usr/bin/git-shell -d /home/git -G git git使用 git-shell 确保这个账号能推拉代码,但是不能通过 ssh 登

2021-12-21 15:27:21 1191

原创 m1芯片运行apm-agent-attach发生UnsatisfiedLinkError

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech问题M1 芯片运行 apm-agent-attach 依赖包发生虚拟机错误 java.lang.UnsatisfiedLinkError 。本地 idea 配置的 jdk 时 zulu 1.8 的版本。Caused by: java.lang.UnsatisfiedLinkError: /Users/jay/Library/Caches/JNA/temp/jna6476532391668202562.tmp: dlopen

2021-12-17 10:35:32 3858 2

原创 @Transactional注解的使用注意

@Transactional 生效的规定

2021-11-19 09:53:00 396

原创 Mybatis使用base64解码函数乱码

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech问题今天在 mybatis 中使用 from_base64 函数解码 base64 内容的字段时,出现了乱码。解决办法在 from_base64 函数外面再包一层 convert 函数做一下类型转换。select real_name, convert(from_base64(user_name), CHAR) as user_name, age from user limit 1说明:user_name 字段是 b

2021-11-19 09:51:20 418

原创 fastjson自定义字段命名规则

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech前置知识fastjson 在将对象转变为 JSON 字符串时,字段默认使用 CamelCase 规则命名。在1.2.15版本之后,fastjson 支持配置 PropertyNamingStrategy,支持四种策略: CamelCase、PascalCase、SnakeCase和KebabCase。属性名策略说明:CamelCase策略,Java对象属性:userName,序列化后属性:userName;Pascal

2021-11-19 09:50:05 3701

原创 一个死锁的demo以及排查

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech死锁出现的原因a. 系统资源不足b. 进程的推进顺序不当c. 资源分配不当死锁指的是两个或者多个进程在执行过程中,因为资源争夺而导致互相等待资源释放,若无外力干涉它们无法继续推进下去的情况。如果系统资源充足,那么进程的资源请求都能够得到满足,那么死锁出现的可能性就会降低,否则会因为争夺有限的资源而陷入死锁。下面通过一个例子来演示这种资源争夺的情况。import java.util.concurrent.*;

2021-11-17 16:03:10 183

原创 Maven时间戳版本引发的未知类异常

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech起因今天在打包新项目到服务器运行时,项目启动失败,报的异常是 ClassNotFoundException,而项目在本地启动是没有任何问题的。分析不过既然是找不到类,我还是再检查了一遍引入的依赖,并且检查 lib 目录下是否有报类缺失的 jar 包。然而,对应的 jar 包确实有在 lib 包下面。为了进一步了解依赖的引入关系,我将主类所在的 jar 进行解压(unzip *.jar),并检查 MANIFEST.MF

2021-11-17 16:00:56 1276 2

原创 如何解决逻辑删除与唯一索引冲突

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech在开发过程中有时候会使用逻辑删除,与之相对的则是物理删除。逻辑删除的作用有几个防止数据误删除,方便数据找回。数据存在一定的商业价值,可以积累起来。数据与其他数据存在关联,不能删除。当然也有它的缺点,比如数据冗余、影响查询效率、查询的 SQL 书写复杂度增加、存在唯一索引时,容易发生插入错误。下面就来介绍如何在使用逻辑删除的同时,建立唯一索引(或者不建立索引但是能保持数据的唯一性)。解决方案:不使用逻辑删除,直

2021-05-08 11:18:14 2083

原创 Date被fastjson格式化为长整型的解决办法

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech问题:在将对象转化为 json 字符串时,对象的 Date 类型的字段会被序列化为 Long 型的字段类型。这样在反序列化的时候,就会报错。java.util.concurrent.CompletionException: com.suntek.vias.taskmanager.exception.SystemException: 服务器内部错误:org.springframework.validation.BeanPrope

2021-04-29 15:33:17 1231

原创 在Mybatis-Plus中指定TypeHandler后不生效的问题与解决办法

问题:在 Mybatis-Plus 中为字段指定 TypeHandler 之后,TypeHandler 只在插入时生效,更新或者查询时未生效。/*** 设备IP*/@TableField(value = "IP", typeHandler = IpTypeHandler.class, jdbcType = JdbcType.INTEGER)private String ip;IpTypeHandler 是一个将 32 位无符号数转换为字符串(或者反过来)的处理器。经过如此指定之后,在插入时

2021-04-19 10:21:48 17150 16

原创 swagger展示枚举类型

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech需求场景在书写 swagger 文档的时候,有些字段是对应一个枚举的。在处理这类字段时,如果在@ApiModelProperty 中手动添加枚举值,可能会出现漏写、错写的情况。接下来就展示一种在 swagger 中处理枚举类型的方法。示例源码在文章底部,有需要的自取。思路通过拦截 swagger 生成文档的过程,查看字段是否对应某个枚举类,将枚举类的值按照自定义的形式添加到字段描述中。Springfox相关的类Mod

2021-04-19 10:20:46 8826

原创 Field error in object ‘xxx‘ on field ‘xxx‘: rejected value [xxx]

GET 请求中的日期参数在使用 @JsonFormat 格式化时间后报错@ApiModelProperty("发布时间-开始")@JsonFormat(pattern = DatePattern.NORM_DATE_PATTERN,timezone = Constants.GMT8)private Date startPublishTime;org.springframework.validation.BindException: org.springframework.validation.Be

2021-04-06 17:34:38 2148

原创 Stream系列之集合分组

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech示例源码辅助类@Data@AllArgsConstructorpublic class User { private String name; private Integer age;}groupingBy() – 分组Java8 中的 groupingBy 实现集合的分组,类似于 Mysql 中的 group by 操作,返回一个 Map。package com.jia.blogdemo.st

2021-04-06 17:33:34 1916

原创 浅谈synchronized和ReentrantLock的区别

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech本文会简单对比一下 synchronized 关键字和 Lock 的区别,不会讲到底层原理。synchronized 和 Lock 有什么区别?使用Lock有什么好处,举例说明。底层结构不同(所属层面 JVM vs API)synchronized 是关键字,属于 JVM 层面的。monitorenter(底层是通过 monitor 对象来完成,其实 await 和 notify 方法都依赖于 monitor

2021-04-06 17:31:54 151

原创 下载源码遇到 java.rmi.ConnectException: Connection refused to host: 127.0.0.1问题与解决方法

今天在 Idea 下载 mybatis 源码的时候,遇到了这个问题。解决方法:设置正确的 jdk 就行了

2021-03-26 15:18:07 636

原创 java.sql.SQLFeatureNotSupportedException 问题及解决方法

昨天在开发接口的时候,碰到了一个异常 java.sql.SQLFeatureNotSupportedException。因为 pom.xml 文件的内容都是我从另一个项目 copy 过来的,另一个项目试能正常运行的,所以会发生错误我也是很诧异。org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'CREATE_TIME' from result set. Cause: ja

2021-03-26 10:26:49 13897 2

原创 快速失败(ail-fast)和安全失败(fail-safe)机制

在 Java 的集合类中,在遍历修改时,会发生两种错误,一种是 fail-fast,一种是 fail-safe 。这两种机制分别对应的是线程不安全和线程安全的集合类。先说fail-fast ,在使用 Java集合的过程中,应该都碰到过 ConcurrentModificationException 。我是大二那年进学校工作室考核期时,写程序的时候第一次碰到这个异常的。原因就是我在for-each 中删除掉了一个元素。当时自然是懵懵的,也不知道这其实是 Java 集合的一个知识点:fail-fast

2021-03-24 08:02:20 458 1

原创 使用 Springboot websocket 实现聊天室

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech通过使用spring集成的websocket和原生H5,实现一个聊天室,以此加深对websocket的了解.文末会附带代码, 部分代码有注释出现原因弥补 HTTP协议的不足,使用HTTP协议,服务端无法对客户端进行主动推送,只能依靠长连接,或者轮询来进行获取实时消息简单原理:客户端先借用HTTP协议, 在第一次握手的时候,告诉服务端,接下来我要把请求升级为Websocket, 然后服务端同意就返回true

2021-03-23 07:52:58 572

原创 Java实现从QQ邮箱向别的邮箱发送邮件

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech先开启发送人邮箱的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,拿QQ邮箱来说明登录->设置->(下滑)POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务->开启服务获得授权码import com.sun.mail.util.MailSSLSocketFactory;import org.slf4j.Logger;import org

2021-03-23 07:52:41 367

原创 Properties properties = System.getProperties(); 有什么用?

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech顾名思义,用来获取操作系统,jvm的一些属性。怎么获取?通过参数。也可以设置自定义的系统参数。Properties本身是继承了HashTable,所以可以set、get键值对(如属性,属性值)// 获取系统属性,虚拟机属性Properties properties = System.getProperties();// 当然也可以通过 System.getProperty("参数"); 直接获取信息// jvm

2021-03-23 07:52:32 472

空空如也

空空如也

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

TA关注的人

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