技术分享
文章平均质量分 68
吧平时使用到的技术点分享出来,这些技术可能只是一个技术点,不需要进行单独的分类
njitzyd
这个作者很懒,什么都没留下…
展开
-
Java中的锁
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文主要介绍了Java中的锁机制以及常用的锁的实现,以帮助工作中更好的运用。锁是jvm内置的锁,不同于锁。关键字可以修饰方法,也可以修饰代码块。关键字修饰方法时可以修饰静态方法,也可以修饰非静态方法;关键字可以修饰代码块。值得注意的是synchronized是一个对象锁,也就是它锁的是一个对象。因此,无论使用哪一种方法,synchronized都需要有一个锁对象。原创 2023-05-04 23:15:17 · 1570 阅读 · 1 评论 -
MySQL的count()函数
在面试的时候或者平时工作的时候,经常会遇到MySQL中的count()函数,本文就是主要学习并了解count()函数中的性能以及效率问题。count() 是一个聚合函数,函数的参数不仅可以是字段名,也可以是其他任意表达式,该函数作用是统计符合查询条件的记录中,函数指定的参数不为 NULL 的记录有多少个。比如这条语句是统计「 t_order 表中,name 字段不为 NULL 的记录」有多少个。也就是说,如果某一条记录中的 name 字段的值为 NULL,则就不会被统计进去。原创 2023-04-24 22:39:30 · 1792 阅读 · 0 评论 -
MySQL的隐式类型转换
在MySQL中:当操作符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。则会发生转换隐式也就是说,MySQL会根据需要自动将数字转换为字符串,将字符串转换数字。避免发生隐式类型转换,隐式转换的类型主要有字段类型不一致、in 参数包含多个类型、字符集类型或校对规则不一致等隐式类型转换可能导致无法使用索引、查询结果不准确等,因此在使用时必须仔细甄别数字类型的建议在字段定义时就定义为 int 或者 bigint,表关联时关联字段必须保持类型、字符集、校对规则都一致。原创 2023-03-16 21:29:21 · 1109 阅读 · 0 评论 -
Spring中BeanFactory FactoryBean和ObjectFactory的区别
BeanFactory和FactoryBean以及ObjectFactory原创 2023-01-15 16:48:02 · 660 阅读 · 0 评论 -
SpringBoot数据绑定
属性自动装配原创 2023-01-11 19:56:03 · 916 阅读 · 0 评论 -
Java中的四种引用类型
Java中四种引用类型原创 2023-01-01 17:34:15 · 3811 阅读 · 1 评论 -
关于JDK8中的字符串常量池和String.intern()方法理解
JDK8中的字符串常量池以及String.intern()具体做了什么事情,以及和字符串常量池的联系的解析以及原理思考原创 2022-11-23 21:59:38 · 636 阅读 · 0 评论 -
GuavaCache学习三种过期策略的学习
基本介绍回收策略Guava Cache提供了三种清理或者刷新策略expireAfter原创 2022-11-06 21:06:57 · 4162 阅读 · 0 评论 -
Java基础之泛型
泛型原创 2022-07-31 21:45:26 · 136 阅读 · 0 评论 -
Spring中的@Autowired和@Resource注解对比
这是自定义标题简介简单对比相同点不同点@Autowired注解@Resource注解代码实战验证@Autowired验证@Resource验证简介@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,但是Spring支持该注解的注入。本文代码已经上传至 gitee简单对比相同点都能进行依赖注入,可以加到属性上也可以加到setter方法上。不同点@Autowired注解原创 2022-04-17 23:24:45 · 362 阅读 · 0 评论 -
Lombok注解的使用
1.简介lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。通俗的说,lombok可以通过注解来标示生成getter settter等代码,简便我们的开发。2.使用2.1引入依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <v原创 2021-12-26 00:39:43 · 1638 阅读 · 1 评论 -
Java工具ObjectSizeCalculator获取对象内存占用
基本类型 长度 the size of an objectInt 4 16Short 2 16Long 8 24Byte 1 16Character 1 16Float 4 16Double 8 24在JDK1.8中可以采用ObjectSizeCalculator类来计算对象在内存中的大小import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;imp原创 2021-12-21 22:28:27 · 6890 阅读 · 1 评论 -
技术科普-OpenResty
OpenResty参考文档转载 2021-12-21 00:28:29 · 113 阅读 · 0 评论 -
技术科普-ectd
ectd介绍转载 2021-12-21 00:22:05 · 92 阅读 · 0 评论 -
Git Flow 工作流程
GitFlow工作流程参考转载 2021-12-21 00:17:26 · 260 阅读 · 0 评论 -
Java日期工具-Joda-Time和FastDateFormat
目录[toc]1.基本介绍Java自带日期格式化工具DateFormat ,但是DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐使用joda-time 库 或者使用Apache的 FastDateF原创 2021-12-19 19:37:57 · 1636 阅读 · 0 评论 -
不可变集合ImmutableMap
概述ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。为什么要用immutable对象?immutable对象有以下的优点: 1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象 2.线程安全的:immutable对象在多线程下安全,没有竞态条件 3.不需要支持可变性, 可以尽量节省空间和时间的开销.原创 2021-12-13 22:00:52 · 505 阅读 · 0 评论 -
Java中的可变参数和数组参数
简介Java方法中的可变参数类型是一个非常重要的概念,有着非常广泛的应用。而可变参数和数组参数又有着很大的联系,下面我们看看这两者的对比以及平时如何使用。使用(注意 可变参数必须作为方法的最后一个形参才行)下面是可变参数的一个简单案例:public class TestVarArgus { public static void dealArray(int... intArray) { for (int i : intArray) { System.原创 2021-12-12 19:37:46 · 1761 阅读 · 1 评论 -
Java中的 WeekHashMap(强引用、弱引用、软引用等)
转载自:java中的weekHashMap弱引用转载 2021-12-06 21:55:52 · 300 阅读 · 0 评论 -
理解Spring容器、BeanFactory和ApplicationContext
理解Spring容器、BeanFactory和ApplicationContext转载 2021-11-22 21:33:45 · 101 阅读 · 0 评论 -
Spring 和 Spring MVC的关系
Spring框架中有很多概念,本文主要是区分一些容易混淆的概念,更方便的去理解和学习Spring框架。Spring和Spring MVC的关系SpringSpring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。简单点的话可以将SpringMVC类比于Struts。Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc是其中一个开源项目,所以简单走个流程的话,htt原创 2021-11-21 21:19:03 · 1787 阅读 · 0 评论 -
Filter和Interceptor的对比
问题引入在开发过程中需要对某些接口进行鉴权,一开始的想法是写个Filter,然后拦截指定的路径,通过获取header中的信息进行鉴权,没有权限则抛出自定义异常,然后自定义全局异常处理器再去拦截。程序测试时发现,没权限时确实被拦截了,但是并没有进入到全局异常处理器,而是直接抛出500。通过查找发现,Filter的在进入Servlet之前进行拦截的,而全局异常是SpringBoot中的(本质是Servlet),所以全局异常处理并不能拦截到Filter抛出的异常。基本概念 与这个相关的一些概念如下:1、原创 2021-11-17 00:59:39 · 1053 阅读 · 0 评论 -
Linux curl命令详解
Linux curl命令详解Linux curl命令转载 2021-11-15 23:20:06 · 94 阅读 · 0 评论 -
zk的 paxos算法和zab协议
分布式系统 协议转载 2021-11-14 15:26:16 · 150 阅读 · 0 评论 -
反射修改static final
之前认为static final的变量是不可改变的,通过反射也是无法修改的,但是这个变量并不是不可以改变的,这里先给出结论:被static final修饰的 基本数据类型和String是无法通过反射进行修改的,但是其他类型(比如基本类型的包装类)则是可以通过反射改变。演示代码private static void setFinalStatic(Field field, Object newValue) throws NoSuchFieldException, IllegalAccessExceptio原创 2021-11-14 14:48:49 · 2874 阅读 · 0 评论 -
Java对象和Map互相转换-BeanMap
引入在开发的时候会遇到这种场景,把一个java对象转换成一个Map,转换的方法有很多比如下面:1、通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个bean,就需要12秒!!!不推荐使用2、通过java反射,获取bean类的属性和值,再转换到map对应的键值对中,这种方法次之,但稍微有点麻烦3、通过Spring框架中的BeanMap类中的方法,比较方便。(本文介绍)代码案例有时候比如我们通过HttpCli原创 2021-11-14 00:09:08 · 1051 阅读 · 0 评论 -
AOP-面向切面编程
1.简介1.1定义这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。1.2理解AOP面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。但是人们也发现,在分散代码的同时,也增加了代码的重原创 2021-11-13 17:46:04 · 494 阅读 · 0 评论 -
return,break,continue 区别
return 会直接另函数返回,函数就运行结束了,所有该函数体内的代码都不再执行了,所以该函数体内的循环也不可能再继续运行。如果你需要让循环继续执行,就不能return函数,而应该选用break或者continue。break:跳出所在的当前整个循环,到外层代码继续执行。continue:跳出本次循环,从下一个迭代继续运行循环。return:直接返回函数,所有该函数体内的代码(包括循环体)都不会再执行。...原创 2021-11-09 23:15:42 · 57 阅读 · 0 评论 -
深入理解 Java的SPI机制
深入理解SPI机制转载 2021-09-01 23:31:28 · 83 阅读 · 0 评论 -
Spring中@Async注解的使用
简介Spring中用@Async注解标记的方法,称为异步方法,它会在调用方的当前线程之外的独立的线程中执行,其实就相当于我们自己new Thread(()-> System.out.println("hello world !"))这样在另一个线程中去执行相应的业务逻辑。本篇先只讲@Async的使用,后面会分析它实现原理。 @Async注解使用条件:@Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的;所使用的@Async注解方法的类对象应原创 2021-08-28 23:03:40 · 446 阅读 · 0 评论 -
Java中定时任务ScheduledThreadPoolExecutor、Timer、@Scheduled和Quartz
1.简介 在实际应用中,有时候我们需要创建一些个延迟的、并具有周期性的任务,比如,我们希望当我们的程序启动后每隔1小时就去做一次日志记录、每天凌晨12点去清理一下数据库中的过期数据等。在JDK中提供了两种方法去创建延迟周期性任务。分别是ScheduledThreadPoolExecutor和Timer。另外还有一个开源的更加强大的任务调度框架Quartz。下面我们来具体认识这三个框架。2.TimerTimer的主要方法有:// 安排在指定的时间执行void schedule(TimerTask t原创 2021-08-27 00:21:29 · 1881 阅读 · 0 评论 -
并发容器-ConcurrentLinkedQueue详解
转载自:并发容器-ConcurrentLinketQueue转载 2021-08-23 23:12:28 · 107 阅读 · 0 评论 -
Java并行流Parallel Stream与Fork-Join线程池
Fork-JoinParallel Stream实现任务的切分,并将任务提交到全局的ForkJoinPool线程池中执行,注意,是全局的线程池。关于ForkJoinPool,我这里简单介绍下。在Fork-Join中,比如一个拥有4个线程的ForkJoinPool线程池,有一个任务队列,一个大的任务切分出的子任务会提交到线程池的任务队列中,4个线程从任务队列中获取任务执行,哪个线程执行的任务快,哪个线程执行的任务就多,只有队列中没有任务线程才是空闲的,这就是工作窃取。可以这样理解工作窃取,比如有4个人干原创 2021-08-22 23:53:32 · 4506 阅读 · 1 评论 -
Java中的线程池
1.线程池原理有时候,系统需要处理非常多的执行时间很短的请求,如果每一个请求都开启一个新线程的话,系统就要不断的进行线程的创建和销毁,有时花在创建和销毁线程上的时间会比线程真正执行的时间还长。而且当线程数量太多时,系统不一定能受得了。使用线程池主要为了解决一下几个问题:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。线程池的构图如下:整体的执行流程如下:当正在运行的线程小于corePoolSize,线程池会原创 2021-08-19 21:30:35 · 402 阅读 · 0 评论 -
java对象间的关系映射工具-mapstruct的使用
<h2 id="1前言">1.前言</h2><p>在现在一个多模块的系统中,随着系统的不断迭代,导致各个系统之间的model 不断地增多。如DTO VO BO 等多个对象之间的属性拷贝就是一个不小的原创 2021-07-06 23:29:00 · 561 阅读 · 0 评论 -
分页助手PageHelper的使用
分页助手PageHelper的使用简介pagehelper是一个很好用的mybatis的分页插件,通过这个插件可以非常方便的实现分页功能。官网地址使用这个插件的使用方式非常简单。引入依赖新建一个springboot项目,添加以下依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</ar原创 2021-02-22 22:01:13 · 274 阅读 · 0 评论 -
Java中 volatile的使用和理解
简介Volatile 是 Java 虚拟机提供轻量级的同步机制。它有三个特性:保证可见性不保证原子性禁止指令重排基本原理当对非volatile变量进行读写的时候,每个线程先从主内存拷贝变量到CPU缓存中,如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的CPU cache中。 volatile共享变量则会在修改之后立即刷新到内存中,并使其他CPU中的变量失效,使得其他CPU使用时必须从内存中重新加载。(这就保证了可见性)在volatile修饰原创 2021-01-31 19:15:24 · 269 阅读 · 0 评论 -
SpringBoot中@EventListener注解的使用
背景在开发工作中,会遇到一种场景,做完某一件事情以后,需要广播一些消息或者通知,告诉其他的模块进行一些事件处理,一般来说,可以一个一个发送请求去通知,但是有一种更好的方式,那就是事件监听,事件监听也是设计模式中 发布-订阅模式、观察者模式的一种实现。观察者模式:简单的来讲就是你在做事情的时候身边有人在盯着你,当你做的某一件事情是旁边观察的人感兴趣的事情的时候,他会根据这个事情做一些其他的事,但是盯着你看的人必须要到你这里来登记,否则你无法通知到他(或者说他没有资格来盯着你做事情)。对于 Spring原创 2021-01-26 22:39:22 · 24742 阅读 · 7 评论 -
多线程下建议使用while而不用if进行循环
在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景。这里对状态的判断使用的是while而不是单线程下常用的if。以下示例展示了一个简单的生产者-消费者模型:当队列满的时候,阻塞set;当队列为空的时候,阻塞get操作。public class EventStorage { private int maxSize; private List<Date> storage; public EventStorage(){ max原创 2021-01-24 19:08:58 · 610 阅读 · 1 评论 -
深入理解线程中断方式
深入理解线程中断方式为什么废弃Thread的stop函数?1.stop是通过立即抛出ThreadDeath异常,来达到停止线程的目的,此异常抛出有可能发生在任何一时间点,包括在catch、finally等语句块中,但是此异常并不会引起程序退出(笔者只测试了Java8)。2.由于有异常抛出,导致线程会释放全部所持有的锁,极可能引起线程安全问题。由于以上2点,stop这种方式停止线程是不安全的。下面是stop的源码(Java8): @Deprecated public final vo原创 2021-01-24 17:54:17 · 81 阅读 · 0 评论