![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 62
一 路
不会就从不会到会
展开
-
MapStruct进行对象转换
平时开发中会遇到各自对象之间的转换,之前需要自己写大量的set、get方法去进行转换赋值,使用MapStruct可以替代传统的get和set方法的转换,并且效率相当,省去了手写转换方法的过程,一定程度上提高了开发效率。原创 2022-09-02 10:06:35 · 1175 阅读 · 0 评论 -
Java之AQS
前言AQS( AbstractQueuedSynchronizer )是一个用来构建锁和同步器(所谓同步,是指线程之间的通信、协作)的框架,Lock 包中的各种锁(如常见的 ReentrantLock, ReadWriteLock), concurrent 包中的各种同步器(如 CountDownLatch, Semaphore, CyclicBarrier)都是基于 AQS 来构建,所以理解 AQS 的实现原理至关重要,AQS 也是面试中区分侯选人的常见考点,我们务必要掌握,本文将用循序渐近地介绍 AQ转载 2022-03-07 17:16:26 · 1192 阅读 · 1 评论 -
Jackson处理Map集合key为对象的情况
当使用 jackson 序列化 Map< ObjectA, ObjectB> 对象时,ObjectA 默认会以 toString 的方式来序列化,而在反序列化时,则会直接失败。这个问题,该如何解决呢?jackson 提供额外的接口供我们扩展,网上以 2.x 版本为例的解决方案很多,1.x 的比较少,这里主要说 1.x 版本的解决方案。在 jackson 里提供了 JsonSerializer 和 KeyDeserializer 抽象类,针对需要特殊处理的对象 ObjectA,提供对应的实现类转载 2022-01-13 14:48:38 · 1267 阅读 · 0 评论 -
java8重复注解
在java8之前,如果需要在同一个元素上使用多个相同类型的注解,需要借助注解“容器”来实现.例如:@TestRepeatables({ @TestRepeatable(name = "test1"), @TestRepeatable(name = "test2")} )public class TestAnnotation1 {}java8开始引入了新特性:重复注解在我们定义需要重复的注解时,使用@Repeatable注解表示对应的注解是可重复的。在上面的例子中我们原创 2021-12-21 11:19:24 · 1266 阅读 · 0 评论 -
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column问题修复
details:"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'geeznv_example_test.t_0.到货日期' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"原创 2021-09-08 11:39:38 · 372 阅读 · 0 评论 -
MySQL执行计划 Extra出现Using index condition 原因与解决方法
Extra中using index condition代表查询条件中虽然出现了索引列,但是有部分条件无法使用索引,会根据能用索引的条件先搜索一遍再匹配无法使用索引的条件。执行如下sql的执行计划结果:EXPLAIN SELECT * FROM tableName WHERE (name= ‘123123’ AND owner_id = 1);执行如下sql的执行计划结果:EXPLAIN SELECT * FROM tableName WHERE (name= ‘123123’ AND owner_原创 2021-07-29 16:26:18 · 14772 阅读 · 4 评论 -
Lombok中@Builder和@Data注解使用注意
Builder 使用设计模式中的创建者模式又叫建造者模式。简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程。在对应实体类上使用@Builder注解标注,可以初始化所需要的实例对象: User.builder() .id(1) .name("zhangsan") .age(15) .build();@Data 注解的主要作用是提高代码的简洁,使用这个注解可以省原创 2021-06-23 17:41:11 · 3994 阅读 · 0 评论 -
synchronized锁优化
Java提供了关键字synchronized,方便快捷的解决的线程安全问题。那么synchronized真的就那么好用吗,就没有什么缺点或者需要优化的地方吗?本文就要介绍一下synchronized锁优化。自旋锁和适应自旋锁锁消除锁粗化偏向锁、轻量级锁、重量级锁锁的膨胀过程1.为什么需要优化?synchronized监视器锁在互斥同步上对性能的影响很大。Java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统的帮忙,这就要从用户态转换到内核态,状态转换需要花费转载 2020-12-10 16:24:36 · 195 阅读 · 0 评论 -
Spring中@Autowired和@Resource注解区别
/*** 自动装配;* Spring利用依赖注入(DI),完成对IOC容器中中各个组件的依赖关系赋值;** 1)、@Autowired:自动注入:* 1)、默认优先按照类型去容器中找对应的组件:applicationContext.getBean(BookDao.class);找到就赋值* 2)、如果找到多个相同类型的组件,...原创 2020-12-04 09:57:24 · 215 阅读 · 0 评论 -
联合索引(辅助索引)在B+树的结构
在什么是索引这篇文章中介绍了索引的常见的数据结构,其对应数据结构的图是以主键索引来讲解的。本文我们一起看下联合使用在B+树的结构是怎么样的?联合索引是什么对多个字段同时建立的索引(有顺序,ABC,CBA是完全不同的两种联合索引);假设联合索引为age,name,school组合的其在B+树的结构如下:联合索引的叶子节点中data数据存储的是主键id;如果要查询语句中查询的是表中所有的数据,则先通过联合索引树找到主键ID,然后再根据主键索引树找到对应data数据;联合索引中一个节点中会按照索引从原创 2020-11-04 10:34:41 · 2545 阅读 · 0 评论 -
MySQL索引底层结构
当数据库的数量太大,sql查询速度比较慢的时,大部分人应该都回给相关的字段添加索引,那索引是什么呢?本文以mysql数据库为例进行相关的闲谈;索引是什么?索引是一种数据结构,一个高效获取数据的排好序的数据结构;常见的索引数据结构:二叉树红黑树Hash表B-Tree我们知道MySQL数据库底层使用的索引数据库结构是B树中的B+树;那为什么不是其他几种数据类型呢?假设我们要存储的数据如下:col1col2135217324445515原创 2020-10-31 16:02:41 · 395 阅读 · 2 评论 -
java.lang.IllegalArgumentException: No enum constant springfox.documentation.service.ParameterType.Q
java.lang.IllegalArgumentException: No enum constant springfox.documentation.service.ParameterType.QUERY项目使用springBoot整合swagger时启动报错:java.lang.IllegalArgumentException: No enum constant springfox.documentation.service.ParameterType.REQUEST at java.lang.原创 2020-10-20 09:52:01 · 8227 阅读 · 0 评论 -
多线程之ExecutorCompletionService使用
在工作中在使用多线程进行并行处理一些事情的时候,我们希望能够依次获取先执行结束的任务结果,我们就需要使用到ExecutorCompletionService类进行处理;当然我们还是看下正常我们在处理多线程并行执行任务的Demo;Demo1:public class ExecutorCompletionServiceDemo { public static void main(String[] args) { //这里只是为了方便,真正项目中不要这样创建线程池原创 2020-08-30 21:21:19 · 7123 阅读 · 2 评论 -
创建线程的四种方式
我们创建线程池一般有四种方式,分别是:1.继承Thread类,重写run()方法;2.实现Runnable接口,重写run()方法;3.实现Callable接口,重写call()方法;4.使用线程池创建线程;本文就介绍下前3种创建线程的方式,第4种使用线程池的方式,大家可以查看下Java之线程池入门一、继承Thread类步骤:1.创建一个类继承Thread类,重写其run()方法,在run()方法中编写需要执行的任务;2.创建继续Thread类的对象;3.调用其对象的start()方法,原创 2020-08-29 11:01:02 · 2891 阅读 · 0 评论 -
Java之四大引用
本文简单介绍下Java的四大引用:强引用,软引用,弱引用,虚引用;四大引用的架构关系强引用(Reference),软引用(SoftReference) ,弱引用 (WeakReference) ,虚应用(PhantomReference)强引用强引用是我们工作中最常见的普通对象引用,只要还有强引用指向一个对象,就能代表对象还存活着,垃圾收集器不会清理这种对象。Java中最常见的就是强引用,把一个对象赋值一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可原创 2020-08-28 21:55:14 · 376 阅读 · 0 评论 -
如何解决ArrayList线程不安全
大家都知道ArrayList是线程不安全的,那我们如何写一个demo来证明ArrayList是线程不安全的呢,并且我们有哪些方式可以解决ArrayList线程不安全呢?首先,我们创建30个线程去往ArrayList中添加元素:public class ArrayListDemo { public static void main(String[] args) { List<Integer> list = new ArrayList<>();原创 2020-07-19 15:57:11 · 1649 阅读 · 2 评论 -
Java之死锁定位分析
什么是死锁死锁是值两个或者两个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去;如果资源充足,进程的资源请求都能得到满足,死锁出现的可能性就很低,否则将会因争夺有限的资源而陷入死锁;产生死锁的主要原因:系统资源不足;进程运行推进的顺序不合适;资源分配不当;形成死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用。(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件:进程已获得的资源,在末使用完之原创 2020-06-30 23:28:31 · 876 阅读 · 0 评论 -
Java之线程池入门
1.为什么使用线程池线程池做的工作主要是控制运行中线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,在从队列中执行。线程池主要的特点:线程复用;控制最大并发数;管理线程;优势:1.降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗;2.提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅消耗系统资源,还会降低系统原创 2020-06-27 14:31:13 · 274 阅读 · 0 评论 -
java之堵塞队列
多线程领域:在某些情况下会挂起线程(即堵塞), 一旦条件满足,被挂起的线程又会被自动唤醒。 使用BlockingQueue(接口)好处是我们不需要关心什么时候需要堵塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。常见队列1.ArrayBlockingQueue:由数组结构组成的有界堵塞队列2.LinKBlockingQueue:由链表结构组成的有界(但大小默认值为Integer.MAX_VALUE)堵塞队列3.SynchronousQueue: 不存储元素的堵塞队原创 2020-06-14 10:58:41 · 218 阅读 · 0 评论 -
Synchronized和Lock的区别
我们从下列几点来介绍下Synchronized和lock的区别1.原始构造synchronized是关键字,属于JVM层面;使用monitorenter和monitorexit(底层是通过monitor对象来完成;其wait/notify等方法也依赖于monitor对象,只有在同步代码块或者同步方法中才能调用wait/notify等方法。额外提一句:反编译synchronized底层中有一个monitorenter,两个monitorexit,一个monitorexit是正常退出解锁,另外一个是异常情原创 2020-06-07 19:56:08 · 782 阅读 · 0 评论 -
CyclicBarrier初步认识
CyclicBarrier的字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事是让一组线程到达一个屏障(也叫同步点)时被堵塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CyclicBarrier的await()方法。比如10个人开会,需要等所有人都到齐会议才开始,我们看下代码实现:package lock;import java.util.concurrent.BrokenBarrierException;import java原创 2020-06-07 18:51:33 · 110 阅读 · 0 评论 -
CountDownLatch初步认识
CountDownLatch的中文翻译为"闭锁",让一些线程堵塞直到另一些线程完成一系列操作后才被唤醒;CountDownLatch主要有两个方法,当一个或者多个线程调用await方法时,调用线程会被堵塞。其他线程调用countDown方法会将计数器减1(调用countDown方法的线程不会堵塞),当计数器的值变成零时,因调用await方法被堵塞的线程会唤醒,继续执行。其中await(long timeout, TimeUnit unit) 方法使当前线程等待直到闭锁计数器为0,除非线程遇到线程中断异常中原创 2020-05-30 13:25:18 · 300 阅读 · 0 评论 -
Java之常见锁介绍
1.介绍公平锁是指多个线程安装申请锁的顺序来获取锁,一个个排好队去获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁,在高并发的情况下,有可能会造成优先级反转或者饥饿现象。并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁,对于Synchronized而言也是一种非公平锁。关于两者的区别:公平锁就是很公平,在并发环境中,每一个线程在获取锁时会先查看此锁维护的等待队列,如果为空,原创 2020-05-24 17:18:11 · 212 阅读 · 0 评论 -
两个线程交替打印1-100
线程之间的通信基本的三个方法:wait():一旦执行该方法,当前线程就会堵塞状态,并释放同步监视器(锁)notify():一旦执行该方法,就会唤醒被wait的一个线程,如果是多个,则唤醒优先级高的线程notifyAll():一旦执行该方法,就会唤醒所有被wait的线程使用 synchronized 和 wait notify 来实现两个线程交替打印:public class TestPrintNumber { public static void main(String[] args)原创 2020-05-08 23:10:51 · 12485 阅读 · 2 评论 -
CAS(比较并交换)
在上一篇文章我们说到,在多线程的情况下,i++无法保证原子性,会出现问题,所以引入了AtomicInteger原子类。使用原子的方式更新基本类型,Atomic包提供了以下3个类。AtomicBoolean:原子更新布尔类型。AtomicInteger:原子更新整型。AtomicLong:原子更新长整型。我们先对AtomicInteger类相关使用做个简单的介绍: public s...原创 2020-05-03 17:37:18 · 376 阅读 · 0 评论 -
volatile关键字解析
在讲volatile关键字之前,首先了解下内存模型相关的概念。Java内存模型由于JVM运行程序的实体是线程,而每一个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工作内存是每一个线程的私有数据区域,而Java内存模型中规定所有的变量都是存储在主内存中的,主内存中是共享内存区域,所有的线程都可以访问,但线程对变量的操作必须在工作内存中进行,首先要将变量从主内存中拷贝一份到自己...原创 2020-05-03 15:48:17 · 314 阅读 · 0 评论 -
解决查询数据库返回大量数据,导致内存溢出的问题
前两天系统出现系统宕机的问题,通过生成的hprof文件发现是系统在执行一个定时任务时,查询大量的数据导入内存,然后在写入文件中原创 2020-04-11 11:36:47 · 9510 阅读 · 1 评论 -
Java使用Quartz框架来实现定时任务
使用Quartz框架来实现系统定时任务,不使用Spring框架集成。Quartz的相关知识这篇文章中不进行介绍!感兴趣的可以学习下:https://www.w3cschool.cn/quartz_doc/quartz_doc-2put2clm.htmlpublic class ScheduleJobService { private static SchedulerFactor...原创 2020-04-11 14:09:17 · 757 阅读 · 0 评论