Java
文章平均质量分 85
唐宋xy
这个作者很懒,什么都没留下…
展开
-
@Schedule定时任务是并行执行吗
@Schedule定时任务是并发执行吗,如何并发多线程执行呢?原创 2022-05-03 22:40:21 · 1821 阅读 · 0 评论 -
手写一个简易版Sentinel
SpringCloud Alibaba Sentinel是当前最为流行一种熔断降级框架,简单易用的方式可以快速帮助我们实现服务的限流和降级,保证服务的稳定性。Sentinel 是什么?随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。不可否认的是,Sentinel功能丰富,并且在提供好用的dashboard提供配置,但是Sentinel在集成到项目中时需要引入多个依赖,并且需要阅读相关文档,以及d原创 2021-05-17 00:44:36 · 215 阅读 · 0 评论 -
最详细的一篇关于Oauth2.0认证模式
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0是OAuth协议的延续版本,但不向 后兼容OAuth 1.0即完全废止了OAuth1.0。很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服 务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准Oauth协议目前发展到2.0版本,1.0版本过于复杂,2.0版本已得到广泛应用。参考:h.原创 2021-04-11 23:55:34 · 3252 阅读 · 0 评论 -
【一起学习JVM】Java中的语法糖是什么味道
Java提供了多种 不同口味的语法糖,每种口味的糖都有不同的食用方法和魔力,你知道哪几种口味的糖呢? 让我们一起来尝一尝吧泛型和类型擦除Java中的泛型只存在于编译阶段,因为只有在编译的时候会对泛型的类型进行校验,在运行期,其实是没有泛型的概念,在经过javac编译之后,就已经将泛型擦除了。示例1——判断字节码对象public class Test { // public static void main(String[] args) { Array.原创 2021-04-10 23:29:22 · 129 阅读 · 0 评论 -
【一起学习JVM】锁优化与锁升级
在JDK1.5之后,JVM开发团队对Synchronized关键进行了优化,并且实现了各种锁优化技术,并且各种测试表明Synchronized并不比ReentrantLock慢,下面就一起看看Synchronized的锁升级以及有哪些锁优化吧~自旋锁和自适应自旋锁自旋锁什么是自旋锁是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。自旋锁的默认自选次数是10次,可以通过JVM参数-XX:PreBloc.原创 2021-03-28 23:16:05 · 386 阅读 · 0 评论 -
【一起学习JVM】Java中的线程安全
Java中在多线程的环境下,多线程并发的操作可能会导致某些变量发生数据不一致的情况,那么如何去保证线程安全,更好的使用多线程呢?可以使用同步锁,但是同步锁在保证线程安全的同时,也会导致程序的并发性降低,操作比较重量级,JVM是如何对锁进行优化,来保证锁的效率和功能呢?一起来学习JVM关于线程安全与锁优化的相关知识吧~线程安全线程安全的实现方法互斥同步含义:互斥同步又叫阻塞同步,简单来讲就是让本来是多线程执行的操作变为单线程,即保证共享数据在同一时刻制备一个线程使用。实现方式:sync.原创 2021-03-21 22:48:56 · 151 阅读 · 0 评论 -
Springboot服务Docker化自动部署?你值得拥有
还在手动将springboot项目打包,然后上传服务器,手动执行启动命令将项目启动吗?你out了!通过Docker配置DockerMaven插件,快速部署,一键将springboot服务器部署到服务器,一键启动,告别传统部署方式,实现自动化运维的第一步,心动吗?快来一起看看~微服务部署方式(1)手动部署:首先基于源码打包生成jar包(或war包),将jar包(或war包)上传至虚拟机并拷贝至JDK容器。(2)通过Maven插件自动部署。对于数量众多的微服务,手动部署无疑是非常麻烦的做法,并且容易.原创 2021-03-14 22:20:19 · 802 阅读 · 1 评论 -
【一起学习JVM】JVM执行引擎-栈
JVM的执行引擎—栈是JVM中最核心的组成部分,负责字节码的执行和计算,在代码中定义的所有的运行逻辑都是在方法中定义,方法在JVM中会压栈运行,在运行完成之后会进行出栈,在执行的过程中,会由堆、方法区、程序计数器等进行配合才可以完成一次完整的执行运行时栈帧结构当方法入栈执行的时,在栈中会新城一个栈帧,栈帧是栈中运行的基本单位,每个栈帧都包含了局部变量表、操作数栈、动态链接、方法出口等。当方法执行完成,栈帧会销毁释放内存。在当前执行线程的栈顶的栈帧称为当前栈即为有效栈,即正在执行的栈帧。局部变量表局原创 2021-02-28 22:19:23 · 124 阅读 · 0 评论 -
【一起学习JVM】Java内存模型与线程
Java内存模型Java内存模型(JMM)的定义是为了屏蔽硬件和操作系统的内存的访问差异,通过定义主内存和工作内存来定义各个变量的访问规则。主内存中保存了所有的变量,工作内存是每个线程自己的私有内存,工作内存中的变量需要从主内存中读取变量,写变量的时候只能在工作内存中完成,不能直接写到主内存。不同的线程的工作内存之间是隔离的,线程之间的变量传递需要通过主内存完成。Volatile变量的访问规则Java内存模型的三大特性:可见性、原子性、有序性Volatile可以保证的特性有:可见性和有序原创 2021-02-06 22:21:53 · 162 阅读 · 0 评论 -
Mybatis动态SQL别再这样用了
背景在调用接口时,突然出现sql查询异常,如下所示,但是这个接口并没有改动异常信息:Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right synt原创 2021-02-05 22:37:02 · 244 阅读 · 0 评论 -
不要在事务中操作中间件了
在大部分场景中,都会有同时操作数据库,并且需要操作中间件的场景,例如:操作数据库同时需要向redis、mq中保存数据或者发送消息,这时候就会涉及到,如果中间件报错影响数据入库怎么办?如果在操作中间件之后报错,数据库回滚,中间件的数据如何补偿?这些问题,在正常的场景中不会有问题,但是在某些场景,会导致数据错误或者某个环节的功能无法工作,所以如何在事务中保证数据库和中间件操作的原子性呢原因分析例如以下伪代码主要功能为:保存订单数据到数据库,并且向mq中发送消息,通知其他服务发送订单成功的短信,并原创 2021-01-31 22:36:36 · 234 阅读 · 0 评论 -
【一起学习JVM】运行期编译优化
编译期分别有javac编译、JIT编译,上一篇文章介绍了javac编译的过程和优化,这一篇文件介绍JIT编译过程和优化。java程序可以通过解释器直接执行,也可以通过编译器将字节码编译为机器码之后再执行,前者无需编译可直接执行,但是执行的效率并不高,而编译之后的机器码执行效率高,但是编译的过程需要耗费时间。所以当JVM发现某个方法或者代码块的运行频繁,那么就会对热点代码进行编译,进行优化,在执行这个任务的编译器称为即时编译器,简称JIT编译器解释器和编译器JVM中一般都会同时包含解释器和编译器,并且解原创 2021-01-23 22:10:21 · 134 阅读 · 0 评论 -
【一起学习JVM】Javac编译
在使用IDE开发时,run的时候会自动将.java文件编译为.class文件,如果是不依赖IDE,需要使用javac命令,手动进行编译。那么javac编译的过程发生了什么呢,如何将.java文件进行编译的呢?JVM的类加载的时候,加载的是字节码文件,在类加载之前,需要通过Javac编译器将.java文件编译为.class文件,提供给JVM进行加载。Java的编译期分为早期编译和晚期编译,早期编译指的是javac的编译过程,将源码转换为字节码,晚期编译指的是JIT编译过程,将字节码编译为机器码。原创 2021-01-22 21:57:34 · 274 阅读 · 3 评论 -
【一起学习JVM】JVM类加载机制
当java的源代码当编译之后,将java文件编译为class文件(字节码文件),然后虚拟机会将字节码文件加载到内存中,并对字节码文件进行校验(字节码文件是否正确、当前的虚拟机是否可以加载该文件),并转换解析,将字节码文件中的内容加载到内存,以便后续进行处理和翻译为机器码,这就是类加载机制类加载的时机JVM加载字节码文件的时机是什么,什么时候开始加载是由固定的条件来进行触发当使用new、getstatic、putstatic、invokestatic这4条字节码指令的时候,如果当前操作的类没有被加载原创 2021-01-15 23:32:41 · 145 阅读 · 0 评论 -
【一起学习JVM】Java命令行工具
Java的命令行工具基本都知道在bin目录下有java.exe、javac.exe这两个,但是在JDK中还内置了其他的有用的性能监控、故障处理、查看JVM的一些工具,可以直观的看到JVM中数据和JVM参数等工具总结名称主要作用jps显示当前系统的所有的JVM进程jstat查看当前内存使用占比和方法区的类加载数量jinfo显示JVM的配置信息,可以直接看到JVM的各项设置的参数jmap查看JVM的堆内存的信息、堆转储快照jhat用于分析heapdump原创 2021-01-10 22:41:29 · 127 阅读 · 0 评论 -
【一起学习JVM】JVM垃圾收集器与内存分配策略
JVM垃圾收集能够让开发者不用再关系内存的占用与释放,专注于代码的编写,不用关系底层的处理方式,但是作为一名具有求知欲的开发者,还是有必要了解JVM是回收对象,一个对象在内存中是如何分配的,更好的操作JVM与编写代码如何判断对象可回收既然JVM可以自动进行垃圾回收,那么首先应该解决的是如何判断什么样的对象可以被回收简单来讲,即当一个对象不被使用的时候,就可以被回收,那么怎么判断这个对象已经不被使用了引用计数法JVM给每个对象增加一个引用计数器,每当该对象被引用的时候,该计数器就加1,当引用原创 2021-01-10 01:18:19 · 97 阅读 · 0 评论 -
【一起学习JVM】Java内存溢出总结
内存溢出的异常有很多,并且每种内存溢出都会有不同的异常信息和解决方式,下面会列出常见的几种内存溢出异常堆内存溢出java.lang.OutOfMemoryError: Java heap space原因:当堆内存不足,并且已经达到JVM设置的最大值,无法继续申请新的内存,存活的对象在堆内存中无法被回收,那么就会抛出该异常,表示堆内存溢出。当一次从数据库查询大量数据,堆内存没有足够的内存可以存放大量的数据大量的强引用对象在堆内存中存活,GC无法回收这些对象,新创建的对象在新生代无法进行分.原创 2021-01-03 23:12:05 · 100 阅读 · 0 评论 -
【一起学习JVM】JVM内存模型
JVM作为运行Java的基础平台,是Java最为重要的核心,所以想要对Java有较深的理解以及运行原理,对象的内存分配等,需先了解JVM的结构、原理、内存模型、如果加载并运行class文件,本篇简单介绍JVM的内存模型文章目录JVM内存模型对象布局彩蛋JVM内存模型区域划分JVM内存模型主要针对于运行时数据区来进行展开,运行时数据区分为:堆、栈、方法区、程序计数器,其中栈分为虚拟机栈、本地方法栈堆:最大得内存区域,保存基本上所有的实例对象,所以堆也是GC主要发生的区域,线程公有的区域.原创 2021-01-01 22:49:07 · 110 阅读 · 0 评论 -
Guava-Files工具类使用
Guava是Google开源的一款工具类库,可以更方便的处理字符串、集合、文件、缓存等方面的功能,并且是面向函数式编程的方式,使用更方面,并且也相对更优雅,增加开发效率Files提供了多种直接复制、写入、读取文件的方法,可以便捷的直接操作,使用较为方便,并且具有丰富灵活的APIFiles简单使用复制文件private static final String SOURCE_FILE = "D:\\resources\\source.txt";private static final Stri.原创 2020-12-26 00:02:59 · 991 阅读 · 0 评论 -
Guava-Precondition工具类使用
Guava是Google开源的一款工具类库,可以更方便的处理字符串、集合、文件、缓存等方面的功能,并且是面向函数式编程的方式,使用更方面,并且也相对更优雅,增加开发效率,在功能方面和apache-common差不多Preconditions为Guava中的断言类,用来做断言,如果不符合期望的结果集,则会抛出特定的断言异常,Objects和assert也可以使用断言Preconditions使用非空断言@Test(expected = NullPointerException.class)p.原创 2020-12-20 22:59:29 · 456 阅读 · 0 评论 -
Guava-Strings工具类使用
Guava是Google开源的一款工具类库,可以更方便的处理字符串、集合、文件、缓存等方面的功能,并且是面向函数式编程的方式,使用更方面,并且也相对更优雅,增加开发效率,在功能方面和apache-common差不多Strings简介及使用Strings可以对字符串本身进行操作,并且方法名称简单易懂,可以快速上手使用字符串判断public void stringsMethodTest() { assertThat(Strings.emptyToNull(""), nullValue().原创 2020-12-19 23:59:30 · 324 阅读 · 1 评论 -
Guava-Splitter工具类
Guava是Google开源的一款工具类库,可以更方便的处理字符串、集合、文件、缓存等方面的功能,并且是面向函数式编程的方式,使用更方面,并且也相对更优雅,增加开发效率,在功能方面和apache-common差不多Splitter类简介和Joinner对字符串拼接相同,Splitter可以方便的实现字符串的切割操作,更快的实现功能,并且也是通过工厂模式来创建对象,链式调用分割字符串public void testSplitOnSplit() { List<String>.原创 2020-12-12 23:30:52 · 521 阅读 · 0 评论 -
Guava-Joiner工具类
Guava是Google开源的一款工具类库,可以更方便的处理字符串、集合、文件、缓存等方面的功能,并且是面向函数式编程的方式,使用更方面,并且也相对更优雅,增加开发效率,在功能方面和apache-common差不多Java8实现字符串操作先看看使用Java8对字符串是如何操作拼接字符串private static final List<String> stringlist = Arrays.asList("Java", "Js", "Guava");public voi.原创 2020-12-11 23:09:34 · 247 阅读 · 0 评论 -
初识ProtoBuf
目前网络通信和数据交换的序列化协议常用的有JSON、XMLJSON作为目前主流的序列化框架,在spring、springboot中广泛使用,并且在接口的开发中,基本都是使用JSON作为数据的接收和处理,JSON相对已经很快了,并且体积也较小,但是Google推出了一个高性能序列化框架ProtoBuf,比JSON更快的一块序列化框架ProtoBuf是什么protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol.原创 2020-12-06 22:18:30 · 167 阅读 · 0 评论 -
Private方法造成NullPointerException
一般常见的NPE,大部分是由于对象为null,调用空对象其中的方法或者属性时,造成NPE,但是在Spring中如果不注意,private方法也会造成NPE原因分析在Spring中,@Transaction注解用来保证事务,保证数据的ACDI原则,一般在多个数据的操作时,会通过事务来保证数据的一致性,防止出现脏数据,但是在Spring中,事务也会出现失效的场景,例如自身方法调用自身方法调用,如果是通过this或者直接调用,则没有走Spring的AOP代理,所以@Transaction注解不能生效,.原创 2020-12-05 23:53:57 · 599 阅读 · 0 评论 -
Sychronized修饰方法和代码块区别与原理
sychronized是java中的同步关键字,可以用来加锁保证线程的同步执行,是并发编程的利器,那么sychronized在方法上和代码块有什么区别呢?sychronized作用作用sychronized可以修饰实例方法、静态方法、代码块等,实现加锁,保证线程的同步,保证同步的功能是通过加锁来实现,获取到锁的线程才可以继续执行,没有获取到锁的线程会进行等待作用范围实例方法sychronized修饰实例方法,锁对象为该类的实例对象静态方法sychronized修饰静态方法.原创 2020-11-22 22:14:14 · 593 阅读 · 0 评论 -
线程无法获取到数据库连接知多少
如果线程在操作过程中被设置为中断状态,则该线程在操作数据库获取数据库连接的时候会出现无法获取到数据库连接的异常,所以最好不要在中断的线程下做资源的操作。线程中断并不等于终止线程JDBC无法获取到连接的异常基本是比较常见的,一般常见的原因有:1. 数据库的账号或密码错误 2.当前服务器无法连接到数据库服务器。但是这个异常:org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connec.原创 2020-11-21 23:10:10 · 1694 阅读 · 0 评论 -
【一起学习Java8】数组去重,你会几种方式?
每日一句:你知道我喜欢吃什么吗?痴痴地望着你前言数据去重是项目中经常出现的应用场景,并且面试中可能也会问到,那么你会几种数组去重方式呢?实战使用额外空间去重List<String> list = Arrays.asList("java", "html", "js", "sql", "java");@Testpublic void test8() { List<String> newList = new ArrayList<>(); for (S.原创 2020-08-24 22:08:20 · 2750 阅读 · 0 评论 -
【一起学习Java8】函数式编程—Lambda表达式
土味情话:“你在干嘛”“我也想你”前言Lambda是一个匿名函数,即没有函数名的函数。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)是不是一脸懵逼,语言上的解释是苍白无力的,并且每个人对于lambda都有自己的理解,所以只有通过实践就会明白到底是怎么一回事来吧,展示~前戏先来看看如果不使用Lambda,匿名函数怎么写比较器对集合排序—Java8之前写法准备数据class Employee { private String name; .原创 2020-08-16 23:25:13 · 187 阅读 · 0 评论 -
TheadLocal与InheritableThreadLocal分不清楚?
土味情话:推荐一个0卡又很甜的零食,我的嘴巴前言首先想一下ThreadLocal的应用场景是什么呢?一般来说,ThreadLocal在项目中用来保存用户的信息(例如session等)将当前用户和当前线程绑定,可以在同一个线程中的任何地方获取到该信息。那么ThreadLocal的缺点是什么呢?刚才说到ThreadLocal将数据和当前线程绑定,所以呢?没错,如果不是同一个线程,那么无法获取到其他线程的数据。而InheritableThreadLocal就是用来解决这个问题###Thre.原创 2020-08-15 00:28:37 · 123 阅读 · 0 评论 -
WeakHashMap内存泄漏?HashMap呢?
文章目录前言Java中的四种引用HashMap内存泄漏场景第一种:内存泄漏代码第二种:内存泄漏代码小总结前言众所周知,WeakHashMap中的key是弱引用,如果再使用之后没有及时remove掉这个key,那么当GC时key就可能会被回收,导致key对应的value对象占用的内存无法回收进而导致内存泄漏,如果有大量的key可能会导致内存溢出、频繁FullGC等问题。说了这么多导致内存泄漏是因为WeakHashMap的key是弱引用从而导致内存泄漏,但是HashMap的key是强引用,也会导致内存泄漏原创 2020-08-09 23:57:17 · 1803 阅读 · 1 评论 -
线程安全的集合就一定线程安全吗?
土味情话:前半生到处浪荡,后半生为你煲汤。前言面试官:小伙子,你知道集合吗?我:知道啊,集合的顶层接口为Collection,下面分为List、Set…(说的口水喷2m远)面试官:好,你刚才说线程安全的集合,那线程安全的集合就一定线程安全吗?我:线程安全的集合肯定线程安全啊(内心:???)面试官:嗯,回去等通知吧我:…So,线程安全的集合就一定线程安全吗?集合简介众所周知,集合分为线程安全和非线程安全,安全的集合有:List接口下的:Vector、CopyOnWriteArrayLi.原创 2020-08-09 01:09:00 · 523 阅读 · 0 评论 -
生产者、消费者阻塞队列-高并发版
生产者、消费者模型-高并发上一篇生产者、消费者模型-传统版中写了传统版(即生产一个消费一个)的生产者和消费者模型,本文记录一下生产者和消费者的高并发版本,即生产者和消费者无需互相等待,可以一直生产、一直消费实现主要是通过BlockingQueue、volatile、AtomicInteger等方式来实现,保证线程安全和数据一致性代码资源类/** * 高并发的生产者消费者阻塞队列 * * volatile/cas/atomicInteger/blockingQueue/线程交互/原原创 2020-08-02 00:01:33 · 380 阅读 · 0 评论 -
生产者、消费者阻塞队列-传统版
生产者、消费者模型生产者负责生产数据,消费者负责消费数据,中间件MQ就是这种模型设计。下面简单实现一个生产者和消费者的模型,实现生产一个数据,消费一个数据。代码/** * * 生产者 消费者阻塞队列 传统版 * * 一个线程对变量+1,一个线程对变量-1 * */public class PC<T> { private volatile int i = 0; private Lock lock = new ReentrantLock(); pr原创 2020-08-01 00:13:56 · 146 阅读 · 0 评论 -
Springboot配置RestTemplate两种方式
发送http请求,使用httpClient或者okHttpClient都非常好用,直接集成就可以使用,在Springboot中,发送http请求还可以选择Springboot内置的RestTemplate类,可以直接发送http请求,不用加入其他依赖,开箱即用一、自动注入RestTemplate并配置添加pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifact.原创 2020-06-21 23:41:49 · 6612 阅读 · 0 评论 -
Springboot配置@Async无效
前言Springboot中为了同时执行多个任务,或者同时查询,加快查询则使用多线程查询,在springboot中,可以直接使用@Async注解来实现异步任务,可以参考Springboot使用@Async实现异步任务简单快捷使用,但是异步任务在某些情况下居然无效。配置正确,代码不报错,但是无法使用多线程异步任务,可能是下面的原因导致:没有在springboot启动类当中添加注解@EnableAsync注解。异步方法使用注解@Async的返回值只能为void或者Future。没有走Spri原创 2020-06-05 23:16:12 · 1770 阅读 · 1 评论 -
Springboot使用@Async实现异步任务
Springboot使用@Async实现异步任务文章目录Springboot使用@Async实现异步任务前言实战一、@Async配置二、实现异步任务三、等待所有子线程完成,主线程返回数据四、@ASync无效说明前言在查询大批量的数据的时候,如果需要查询多个表中的数据,或者不仅查询数据库,还需要取其他的系统中查询数据,然后将所有查询到的数据一起返回,这个时候,如果是单线程查询效率慢,这个时候多线程就可以解决这个查询效率慢的问题,Springboot中提供了@Async注解,一键实现异步操作~实战原创 2020-05-31 22:23:19 · 522 阅读 · 0 评论 -
数据库数据映射实体类报错:Null value was assigned to a property of primitive type setter
在查询数据中的数据封装到实体类时,出现类型不正确错误错误信息org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of com.agenda.api.entity.M2FEntrance.inputtype根据异常信息的提示和查询的解决方案来看:数据库的数据的类型和当前实体类中映射的类型不一致,将数据库中的类型和实体类中的类型设置为一致但是经过查.原创 2020-05-29 23:01:26 · 629 阅读 · 0 评论 -
Springboot多环境配置
前言开发项目中,因为会将一些配置提取到配置文件中,但是如果是单独的配置文件(yml或者properties),那么在不同的开发环境中,使用到的配置是不一样的时候,就会导致频繁的修改,这个时候,可以选择使用多个配置来作为不同的环境的配置文件,在打包的时候,选择不同的配置文件~一、依赖POM依赖profiles标签在标签中 <!--多环境设置--> <profiles> <profile> <id&g原创 2020-05-24 22:35:39 · 288 阅读 · 0 评论 -
Springboot链接SqlServer配置并通过JPA操作实战
springboot链接sqlserver和其他数据库基本一致,当然因为每个数据库的数据类型有些不同,所以在数据库方言需要配置一下文章为Springboot链接SqlServer2012,其他的SqlServer版本基本一致一、配置maven依赖如果下载不下来,那么手动在maven仓库下载并安装到本地maven仓库中,就可以正常引入,不过无法下载,可以使用第二个依赖,亲测可以直接下载。<!--这个依赖一般下载不下来--><dependency> <gr.原创 2020-05-17 22:28:46 · 8043 阅读 · 1 评论