自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李光 未来科技

不积跬步,无以至千里,不积小流,无以成江海

  • 博客(324)
  • 问答 (2)
  • 收藏
  • 关注

原创 【DJL】Springboot+Maven+DJL实现java调取pytorch模型

前言近期学习了DJL(深度java学习),有了一点小的研究成果,特以此博客分享给大家。这个技术是一个特别新的技术,是亚马逊云服务在2019年re:Invent大会推出的专为Java开发者量身定制的深度学习框架,网上的资料比较少,只有官方文档可以参考,研究起来难度比较大,但是经过不懈的努力,终于搞定了,接下来以官网的demo入门。由于这块有很多坑,所以有必要好好的说一下。官网地址:https://docs.djl.ai/jupyter/load_pytorch_model.htmldemo1、创建Sp

2020-08-23 21:39:49 12791 25

原创 【多线程 六】彻彻底底搞懂CAS,解决ABA问题

前言:如果不知道JMM(java 内存模型),还请看博主的上一篇博客: volatile关键字与内存可见性详解 ,因为本博客还需要JMM的理论基础。博客内容导图1、CAS是什么CAS(Compare-And-Swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问. CAS 是一种无锁的非阻塞算法的实现。以上是一本书给出的定义。其实我们在上篇博客已经提过CAS了,AtomicInteger 实现num++,AtomicInteger的底层就是

2020-06-23 01:11:45 3202 1

原创 【多线程 五】volatile关键字与内存可见性详解

前言:本篇博客内容较多,1、为什么会有volatile关键字?之前的内容我们都是用synchronize关键字进行同步,但是synchronize的效率低,每次都要cpu判断有没有锁,有锁就会阻塞。所以说synchronize是一个重量级的锁,比较耗费资源,因此引出vllatile,volatile相对synchronize 是一个轻量级的锁。2、volatile特点(1)保证内存可见性只要有一个线程将变量的值改了,那么其他的线程马上就可以得到这个改过后的值。(2)不保证原子性原子性:我们把

2020-06-21 17:11:07 1681 3

原创 面向对象与面向过程的本质的区别

前言:如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的!一、面向对象与面向过程的区别面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个

2018-01-10 20:19:04 328144 225

原创 【工具】idea快速启动多个微服务

idea 快速启动多个服务

2023-02-09 16:11:34 954 2

原创 【mysql】云服务器被攻击,数据库以及数据都被删除如何通过binlog日志恢复

根据binlog 日志恢复数据

2022-11-01 16:45:34 2553 5

原创 【Java 基础】Java Validation API分组,顺序校验,以及自定以校验注解的优雅写法

Java Validation API分组,顺序校验,以及自定以校验注解的优雅写法

2022-10-18 15:51:20 1888 2

转载 @Valid与@Validated区别

@valid 注解作用

2022-10-12 13:45:38 448 1

原创 【微信小程序】 java如何生成小程序码,并跳转到指定落地页 demo

Java 生成微信小程序二维码 ,可以指定小程序页面

2022-09-20 17:16:48 946 1

原创 【mysql】垂直分表的意义是什么

当数据库数据量大的时候,我们会考虑分库分表,但是在有些情况我们还会考虑垂直分表,比如这个表的字段过多,有几十个字段,我们就需要考虑垂直分表了,垂直分表解决了什么问题,接下来大家一起来看一下吧。...

2022-07-26 14:21:18 705 1

原创 【mysql 】 mvcc(多版本并发控制)原理的理解

mysql mvcc 不知道的看一看

2022-07-22 17:09:52 1128 1

转载 mysql的limit分页,越往后为什么越慢,怎么解决

一 什么是limit分页问题limit 20 这样的语句。仅仅扫描前30行,select* from table limit 0,10扫描满足条件的10行,返回10行,但当limit 866613,20的时候数据读取就很慢,limit 866613,20的意思扫描满足条件的866633行,扔掉前面的866613行,返回最后的20行,可想而知这时会很慢,如下图,达到37.44秒之久。二 怎么解决利用表的覆盖索引来加速分页查询我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这

2022-04-01 16:26:01 4357

转载 【ApplicationContextAware 和InitializingBean区别】

ApplicationContextAware接口1.首先什么是ApplicationContextApplicationContext的BeanFactory 的子类, 拥有更强大的功能,ApplicationContext可以在服务器启动的时候自动实例化所有的bean,而 BeanFactory只有在调用getBean()的时候才去实例化那个bean, 这也是我们为什么要得到一个ApplicationContext对象, 事实上Spring2相关的web应用默认使用的是ApplicationCont

2022-03-22 14:13:10 818

原创 【rabbitmq 】如何保证消息可靠性

1、rabbitmq如何保证消息可靠首先我们知道一个完整的结构涉及到生产者,mq,消费者这三部分,mq解除了系统之间的耦合,但是会出现一些问题,比如现在是三部分,它们都是独立的,每一部分都会存在消息丢失的情况,所以要从这三部分一起解决此问题。如下图。1.1 mq保证消息不丢失对交换机,队列,消息进行持久化,持久化之后mq断电重启,消息还会被继续消费1.2 消费者消息不丢失通过手动ack机制,当消费者成功将消息消费成功后,返回消息给mq,告诉mq你发送的消息我已经消费成功了,mq将队列中的消息进行

2022-01-05 16:26:15 1946 2

原创 【mysql】添加拼音首字母

1、功能实现说明图一图二数据量很大,目的是找到相应字段的首字母,如果后台写代码可能耗时比较久,现在整理一个mysql函数,轻松处理2、mysql函数DROP FUNCTION IF EXISTS `GET_FIRST_PINYIN_CHAR`;CREATE FUNCTION `GET_FIRST_PINYIN_CHAR`(PARAM VARCHAR(255)) RETURNS VARCHAR(2) CHARSET utf8mb4BEGIN DECLARE V_RETURN VARCHAR

2021-12-09 17:29:18 541

转载 【java 查漏补缺】彻底搞清分布式和集群的区别

概述1.单机结构我想大家最最最熟悉的就是单机结构,一个系统业务量很小的时候所有的代码都放在一个项目中就好了,然后这个项目部署在一台服务器上就好了。整个项目所有的服务都由这台服务器提供。这就是单机结构。那么,单机结构有啥缺点呢?我想缺点是显而易见的,单机的处理能力毕竟是有限的,当你的业务增长到一定程度的时候,单机的硬件资源将无法满足你的业务需求。此时便出现了集群模式,往下接着看。2.集群结构集群模式在程序猿界有各种装逼解释,有的让你根本无法理解,其实就是一个很简单的玩意儿,且听我一一道来。单机处

2021-11-24 16:50:12 192

转载 【java 查漏补缺】java接口回调机制到底是怎么回事

一、回调的含义和用途1、什么是回调?一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用、异步调用和回调。同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走。回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,例如A要调用B,B在执行完又要

2021-11-24 16:18:10 208

原创 【Spring】Spring事务失效场景分析与理解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-11-08 17:32:21 628

原创 【springCloud】com.netflix.hystrix.exception.HystrixRuntimeException:XXXXX timed-out

问题:springcloud 服务调用的时候报错:com.netflix.hystrix.exception.HystrixRuntimeException: CouponTrialApiClient#varietyModelTrial(TrialQuery) timed-out and no fallback available.解决办法1、pom文件 <dependency> <groupId>org.springframewo

2021-10-21 19:46:40 863

转载 【java8】 java8分组后,对数据顺序不改变的控制

   一.概述  默认groupingBy代码里会生成一个HashMap(hashMap是无序的,put的顺序与get的顺序不一致) HashMap是无序的,HashMap在put的时候是根据key的hashcode进行hash然后放入对应的地方。所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key...

2021-10-11 17:39:58 772

原创 【查漏补缺】mybatis自增返回主键的两种方式——selectKey、useGeneratedKeys

1、useGeneratedKeys+keyProperty实现主键自增这种方式是我们经常用到的方式,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。eg: <insert id="insert" parameterType="im.ziwo.audit.baseservice.model.Attachment" useGenerat

2021-09-30 13:51:10 841

原创 Maven——maven中的 pom和import的作用到底是什么

1、前言在微服务的项目中,我们是不是经常在父项目中写一些统一版本的jar包,但是其中很多时候都有如下类似代码的影子,对于下面的代码中pom和type的作用是否明白呢,如果不明白,欢迎看下面的内容。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies&lt

2021-09-08 19:27:03 6057 1

转载 Eureka 缓存机制详解

上节为大家介绍了 Eureka 的工作原理,其中提到了 Eureka Server 内部有二层缓存机制,那这些机制是如何工作的,以及 Eureka Server 是如何存储服务的注册信息,本节会给大家揭晓。Eureka 在使用过程中有一些非常重要的配置项,本节也会整理出来,方便大家以后在生产环境根据项目场景来调整。Eureka Server 数据存储我们知道 Eureka Server 在运行期间就是一个普通的 Java 项目,并没有使用数据库之类的存储软件,那么在运行期间是如何存储数据的呢?Eur

2021-04-30 20:48:18 1479 1

转载 Arrays.sort()和lambda表达式

1、对基本数据类型数组的排序:数字排序:int[] intArray = new int[]{1,34,5,-9};Arrays.sort(intArray);System.out.println(Arrays.toString(intArray));字符串排序(先大写后小写):String[] strArray = new String[]{"Z", "a", "D"}; Arrays.sort(strArray); System.out.println(Arrays.toString(

2021-04-13 10:20:34 2335

原创 【spring】注解开发

前言:JavaConfig(基于java类进行配置)实现配置和上篇博客说到的xml配置bean是一样的,只不过spring4之后更加推荐javaConfig的方式。1、注解(1)@Configuration该类等价 与XML中配置beans,相当于Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean,与xml中配置的bean意思一样。(2)@Import@import 注解允许从另一个配置类中加载 @Bean 定义。考虑 ConfigA 类,如下所示:@C

2021-03-14 13:39:25 123

转载 【Spring】彻底搞明白事物的传播级别

1、什么是事务的传播行为一个方法运行在了一个开启了事务的方法中时,当前方法是开启一个新的事务还是使用原来的事物1、PROPAGATION_REQUIRED结论:通过这两个方法我们证明了在外围方法未开启事务的情况下Propagation.REQUIRED修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。结论:以上试验结果我们证明在外围方法开启事务的情况下Propagation.REQUIRED修饰的内部方法会加入到外围方法的事务中,所有Propagation.REQUIRED修饰的内部

2021-03-14 13:38:43 828 1

原创 【JVM】垃圾回收算法详细对比说明

导图1、 概述在讲这些算法的时候,我们要知道我们的目的是垃圾回收,垃圾回收的是那些没有用的对象,但是什么时候判断对象是没有用的(死亡的),要进行垃圾回收的呢,那么此阶段有两种算法,分别是引用计数算法,和可达性分析算法,这个阶段也就是标记阶段。接着,在真正回收这些对象的算法上又分为复制算法,标记清除算法和标记整理算法。2、引用计数算法2.1概念对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计

2021-03-14 13:27:05 548 1

原创 【实战技能】超详细解决CPU占用过高的问题的办法

1、代码模拟import java.util.Random;public class HighCPUDemo { public static void main(String[] args) { while (true){ System.out.println(new Random(999999)); } }}2 、top命令找出cpu占用最高的进程如下图 看到java的进程id为74953、ps -ef 或者 jps

2021-03-14 13:26:12 1287 5

转载 【git】github骚操作

1.常用词 watch: 对于别人的项目,默认自己都处于 Not watching 的状态,当你选择 Watching,表示你以后会关注这个项目的所有动态,这个项目以后只要发生变动,如被别人提交了 pull request、被别人发起了issue等等情况,你都会在自己的个人通知中心,收到一条通知消息,如果你设置了个人邮箱,那么你的邮箱也可能收到相应的邮件。 stars: 星星,相当于点赞,不过这个赞需要得到程序员小伙伴的认可才会被star ...

2021-03-14 13:20:48 219

转载 【mysql】mybatis,防止sql注入原理以及#{}和${}区别

1、MyBatis如何防止SQL注入 SQL注入是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中(例如,为了转储数据库内容给攻击者)。[摘自] SQL injection - WikipediaSQL注入,大家都不陌生,是一种常见的攻击方式。攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序。所以,在我们的应用中需要做一些工作,来防备这样的攻击方式。在一些安全性要求很高的应用中(比如银

2021-03-08 13:26:00 1937 1

转载 【多线程】生产者消费者传统版和阻塞队列版

前言等待与唤醒机制其实就是经典的生产者与消费者问题我们知道,生产者要想和消费者作用在一件产品上,必须要用到锁机制。通过锁机制保证一个产品同一时间只有一个角色在执行。下面将分别使用Synchronized和Lock锁解决生产者和消费者的问题。1Synchronized版/** * 线程之间的通信问题:生产者与消费者问题! * A和B操作同一个变量,线程交替执行,num=0 * A num+1 * B num-1 */public class A { public static v

2021-03-07 23:01:42 228 2

转载 【多线程】虚假唤醒(什么时候用while,什么时候用if)

那什么是假唤醒?当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁避免虚假唤醒下面是避免虚假唤醒的示例:package duoxiancheng.bao;/* * 虚假唤醒的解决: * wait要始终保证在while循环当中。 */public class LockTest { public stati

2021-03-07 12:28:00 1444 1

原创 【枚举与countDownLatch的应用】

1、前言:来源周阳面试第二季mainpublic class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(6); for (int i = 1; i <=6 ; i++) { new Thread((

2021-03-02 23:45:21 121 1

原创 【设计模式】深入理解静态代理和动态代理

1、UML2、静态代理2.1 例子背景:模仿租户租房子。(1)抽象接口/** * 抽象接口 */public interface Rent { public void rent();}(2)Host类(房东要出租房子)public class Host implements Rent { @Override public void rent() { System.out.println("我要出租房屋"); }}(3) Prox

2021-03-02 22:33:35 217 2

原创 【jvm 八】彻底理解方法区(轻松理解常量池)

1、方法区、永久代和元空间(Metaspace)到底要怎么理解可以将方法区理解为接口,永久代和元空间是方法区的不同的实现方式。元空间与永久代的最大的区别在于:元空间不在虚拟机设置的内存中,而是使用本地内存,因此它可以有更大的空间,防止内存溢出。方法区是一块独立于java堆的内存空间2、堆、栈、方法区的交互关系3、设置方法区大小的参数元数据区大小可以使用参数-XX : MetaspaceSize和-XX : MaxMetaspaceSize指定。这个依赖于平台,因为是本地

2021-02-25 09:04:41 750 6

原创 【Spring】谈谈IOC和DI

前言:控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,有很多人都说DI就是IOC,其实看你怎么理解了。如下我们看到ApplicationContext有这么多的实现类,每一种都相当于一个DI,实现了IOC的思想。1、什么是IOC以前用对象是自己是通过new 来获取,现在 通过spring容器来进行创建并通过注入的方式来获取。这个创建对象的控制权由调用者自己变成了spring容器...

2021-02-25 09:01:57 179 4

转载 【mysql 】(联合查询)union all应用

根据雇员的家庭信息,统计雇员的孩子数量... “用外连接进行行列转换(列→行):汇总重复项于一列”部分, 我们可以求得以员工为单位的员工子女列表。有了这个列表后,对员工进行一下聚合很容易就可以知道每个员工抚养了几个孩子。  输 出结果如下所示: employee    child_cnt  --------    --------...

2021-02-18 22:46:55 155 2

原创 【jvm】逃逸分析深入理解

1、问题引入——堆是分配对象存储的唯一选择吗?不是,对象是在java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是 如果经过逃逸分析(Escape Analysis) 后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。如何将堆上的对象分配到栈,需要使用逃逸分析手段。2、逃逸分析概述将堆上的对象分配到栈这是一种可以有效减少Java程序中同步负载和内存堆分配压力的跨函数全局数据流分析算法。通

2021-02-08 23:59:13 485

原创 【JVM】 TLAB到底是干什么的

1、为什么出现TLAB(Thread Local Allocation Buffer )堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度。所以TLAB产生2、什么是TLAB ?从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TL

2021-02-07 22:24:16 3187 2

原创 【多线程】LockSupport的线程等待唤醒机制

前言:传统的线程等待唤醒机制有两种方式分别是synchronized(wait和notify)和JUC包中的显示锁Lock(condition的await()方法和signal()方法),但是这两个方式有两个缺点,分别是都不能脱离synchronized,和lock、unlock,如果脱离就会报错,还有就是wait和notify,await和signal的执行顺序要固定,必须先wait然后在notify,否则会导致程序无法结束。所以出现第三种方式,那就是LockSupport(park和unpark),

2021-02-06 23:41:18 387 1

空空如也

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

TA关注的人

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