自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Docker(从入门到部署微服务集群)

① 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统② 运行时利用沙箱机制形成隔离容器,各个应用互不干扰③ 启动、移除都可以通过一行命令完成,方便快捷。

2022-10-04 15:57:42 2649

原创 业务表对应主键为varChar类型且无自增策略的新增与修改问题

这里机构id为主键且无自增策略,也就是说机构id这个字段是通过手动输入保存的,还有这个机构DES密钥的问题(在此处花费了较长时间)。结果便可以修改成功。至此原因找到,得出以下总结:使用Mybatis / Mybatis plus 在编译解析xml中sql语句时,无法编译解析数字开头的字段。这段代码可以看到修改或新增提交from表单时是通过branchId(主键)来判断具体走新增还是更新,所以此套逻辑必定不行。根据报错检查映射以及参数占位等等问题均无果。解决方法:(使用``将特殊字段包裹起来)

2024-06-17 14:50:39 581

原创 SpringBoot中使用@Insert、@Update实现批量新增、更新

使用以上两种方式均可进行测试验证,此时数据均被批量新增成功!

2023-06-06 10:46:32 6881 4

原创 Java单例模式读取MySql配置文件

【代码】Java单例模式读取MySql配置文件。

2023-03-10 10:41:56 549 1

原创 JUC并发编程设计模式

有如下场景,做一个系统的健康状态监控(记录电脑CPU的使用率、内存的使用率)实现定时监控。实现这样一个场景,可用一个后台的监控线程不断记录。—— stop()方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁。但却有着很大的区别,线程1输出a 5次,线程2输出b 5次,线程3输出c 5次。:监控线程每隔1s监控系统,主线程处于休眠状态,3.5秒后休眠状态被打断。比如,先打印2后打印1(如果不加控制两个线程被CPU调度的时间不受控制)

2023-03-09 13:27:26 705

原创 ReentranLock(可重入锁)

条件变量synchronized 中也有条件变量,就是我们讲原理时那个 waitSet 休息室,当条件不满足时进入 waitSet 等待ReentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量的,这就好比● synchronized 是那些不满足条件的线程都在一间休息室等消息● 而 ReentrantLock 支持多间休息室,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤醒使用要点:● await 前需要获得锁。

2023-03-08 10:47:00 1097

原创 JUC并发编程——多把锁

线程1按AB的顺序加锁,先获得锁A,线程2也是按AB的顺序进行加锁,线程2此时想获取对象A的锁时获取失败(进入对象A的EntryList中阻塞),这时线程1再尝试获取B对象的锁。死锁是两个线程持有对方需要的锁,导致线程都无法继续向下运行,两个线程均陷入阻塞;● 使两个线程的执行时间有一定的交错(不集中在一起执行/设置睡眠的时间为一个随机数===>将其指令交错开,第一个线程很快运行完,第二个线程将没有机会改变对方的结束条件)现在小南要学习,小女要睡觉,但如果只用一间屋子(一个对象锁)的话,那么并发度很低。

2023-03-07 16:03:55 622

原创 JUC并发编程——Park & Unpark

● 调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING–> RUNNABLE。● 当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING --> RUNNABLE。● t 线程等待时间超过了 n 毫秒,或调用 obj.notify() , obj.notifyAll() , t.interrupt() 时。

2023-03-07 10:47:18 531

原创 JUC并发编程——wait-notify

●obj.wait()让进入 object 监视器的线程到 waitSet 等待●在 object 上正在 waitSet 等待的线程中挑一个唤醒●让 object 上正在 waitSet 等待的线程全部唤醒它们都是线程之间进行协作的手段,都属于 Object 对象的方法。无论是wait还是notify必须获得此对象的锁,才能调用这几个方法示例try {/* 需先获取对象锁,成为Owner后才能调wait();

2023-03-06 15:27:50 535

原创 Java反射实现(3种)

1、定义一个Person类,属性包含姓名、年龄;包含实例方法study()和eat(),通过反射机制访问类的属性,调用类的方法。通过反射操作类共有三种方法。

2023-03-05 20:10:35 479

原创 synchronized底层

于是,小南干脆在门上刻上了自己的名字:【小南专属房间,其它人勿用】,下次来用房间时,只要名字还在,那么说明没人打扰,还是可以安全地使用房间。),但他们的书包样式都一样,因此每次进门前得翻翻书包,看课本是谁的,如果是自己的,那么就可以进门,这样省的上锁解锁了。如果在尝试加轻量级锁的过程中,CAS操作无法成功,这时一种情况就是有其他线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。小女是要用房间,但使用的时间上是错开的,小南白天用,小女晚上用。

2023-03-05 15:34:52 646

原创 Java线程安全习题

多线程环境下进行测试某个类的线程安全,安全问题不容易复现,上述测试中使用sleep()增加其时间间隔的方式期望线程上下文切换的机率增大,使现象更容易出现。为节省时间我们还可以使用编写测试脚本的方式(一旦出现线程安全问题,会在某次循环中将其展示出来)。共享变量,其只能保护自身,并不能影响到另一个对象上的getMoney() 、setMoney()。锁加在两个对象上相当于两个线程进入了两个房间,起不到保护线程作用。若要分析线程安全问题,需考虑哪部分代码属于临界区(找出临界区便可对其加锁)

2023-02-28 23:49:44 952

原创 线程安全实例分析

线程1、2均执行方法内的代码,线程1执行get(“key”) == null,还未执行完,线程发生上下文切换轮到线程2执行,线程2也执行到此处得到的get(“key”) == null,线程2发现为null后put(“key”, v2),完成后又切换为线程1,线程1又put(“key”, v1)。② Connection也是线程安全的,Connection属于方法内的局部变量,即使有多个线程访问,线程1创建的为Connection1而线程2创建的为Connection2,两者独立互不干扰。

2023-02-28 15:11:31 521

原创 JUC并发编程——线程安全问题

本次使用阻塞式的解决方案:synchronized,来解决上述问题,即俗称的【对象锁】,它采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其它线程再想获取这个【对象锁】时就会阻塞住。这中间即使 t1 的 cpu 时间片不幸用完,被踢出了门外(不要错误理解为锁住了对象就能一直执行下去哦),这时门还是锁住的,t1 仍拿着钥匙,t2 线程还在阻塞状态进不来,只有下次轮到 t1 自己再次获得时间片时才能开门进入。:2 1s 后 1【调用a()时锁住的为类对象,调用b()时锁住的为n1对象】

2023-02-27 14:35:19 329

原创 JUC并发编程(二)

当调用了 start() 方法之后,注意,Java API 层面的 RUNNABLE 状态涵盖了 操作系统 层面的【可运行状态】、【运行状态】和【阻塞状态】(由于 BIO 导致的线程阻塞,在 Java 里无法区分,仍然认为是可运行)有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。—— 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU(调度器不会考虑调度阻塞状态的线程),会导致线程上下文切换,进入【阻塞状态】

2023-02-26 17:47:09 387

原创 Java线程——常见方法

①:直接调用run方法并不会启动新的线程} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }} };t1 . run();} }

2023-02-23 11:12:43 935

原创 Java线程

两个线程同时运行均要使用CPU,While(ture)为死循环,两个线程均需要不断使用CPU,而两个线程大量使用CPU会造成CPU占用率达到100%,其他代码、操作系统其他程序就会暂停卡住。因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码(从使用CPU到不适用CPU称之为线程的一次上下文切换)当然它的底层是否由多个核心对这两个线程并行执行还是一个核心对它们并发处理,包括打印的前后顺序是不由我们控制的。(快照:只能查看某一刻) 查看某个 Java 进程(PID)的所有线程状态。

2023-02-22 14:34:47 2948

原创 JUC并发编程——进程与线程

● 但如果是四核 cpu,各个核心分别使用线程 1 执行计算 1,线程 2 执行计算 2,线程 3 执行计算 3,那么 3 个线程是并行的,花费时间只取决于最长的那个线程运行的时间,即 11ms 最后加上汇总时间只会花费 12ms。● 进程就可以视为程序的一个实例。● 有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu ,不至于一个线程总占用 cpu,别的线程没法工作。

2023-02-21 16:39:21 440

原创 CAS概述

没有并发争用的时候或者是cells数组正在初始化的时候,会使用CAS来累加值到base,有并发争用,会初始化cells数组,数组有多少个cell,就允许有多少线程并行修改,最后将数组中每个cell累加,再加上base就是最终的值。如果在尝试加轻量级锁的过程中,CAS操作无法成功,这是一种情况就是有其他线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁升级为重量级锁。:对一个对象加锁后,需将原来旧的信息暂存到栈帧的锁记录结构中,将来解锁时,再将暂存的Mark Word旧的信息恢复回去。

2023-02-20 15:02:30 584

原创 JAVA内存模型(JMM)

假如i的赋值可能需要做一些计算,j的可能马上会运算完毕;它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中的高速缓存中查找变量的值,必须到主存中获取它的值,线程操做volatile变量都是直接操作主存===>因为t线程要频繁从内存中读取run的值,JIT编译器会将run的值缓存至自己工作内存中的高速缓存中(做进一步优化),减少对主存中run的访问,提高效率。1秒之后,main线程修改了run的值,并同步至主存,而t是从自己工作内存中的高速缓存中读取这个变量的值,结果永远是旧值。

2023-02-14 13:03:42 660

原创 JVM——运行期优化

对于大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。● 将一些字节码编译为机器码,并存入 Code Cache,下次遇到相同的代码,直接执行,无需再编译。内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换。● 将字节码解释为机器码,下次即使遇到相同的字节码,仍会执行重复的解释。0层:解释执行,用解释器将字节码翻译为机器码。

2023-02-10 18:46:57 904

原创 JVM——类加载器

使用场景(什么时候需要自定义类加载器)◆ 想加载非 classpath 随意路径中的类文件◆ 通过接口来使用实现,希望解耦时,常用在框架设计◆ 这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于 tomcat 容器步骤① 继承ClassLoader父类② 要遵从双亲委派机制,重写 findClass 方法——不是重写loadClass方法,否则不会走双亲委派机制③ 读取类文件的字节码④ 调用父类的 defineClass 方法来加载类。

2023-02-09 15:50:39 355

原创 JVM——类加载与字节码技术(3)

● instanceKlass这样的【元数据】是存储在方法区 (1.8后的元空间内),但_java_mirror是存储在堆中(类在加载的同时会在堆内存中生成一个java_mirror的对象,如Person类会产生一个Person.class)而c不为基本类型(包装类型),底层会做自动的装箱操作将基本类型转换为包装类型,虽然前面为静态的但是也不会在准备阶段完成,只能推迟到初始化阶段完成。● 运行时可能会报错,是因为缺少一个.dll的文件,我们在JDK的安装目录中找到该文件,复制到缺失的文件下即可。

2023-01-29 20:31:47 458

原创 JVM——类加载与字节码技术(2)

其实就是指 java 编译器把* .java 源码编译为* .class 字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是 java 编译器给我们的一个额外福利。注意,如果调用的是foo(),即未传递参数时,等价代码为foo(new String[]{}),创建了一个空数组,而不是直接传递的null。,只是为了便于阅读,给出了 几乎等价 的 java 源码方式,并不是编译器还会转换出中间的 java 源码,切记。泛型也是在 JDK 5 开始加入的特性,但 java 在。

2023-01-16 23:47:41 422

原创 JVM—类加载与字节码技术

● 可以看到多出来一个 Exception table 的结构,[from, to) 是前闭后开(也就是检测2~4行)的检测范围,一旦这个范围内的字节码执行出现异常,则通过 type 匹配异常类型,如果一致,进入 target 所指示行号。● 终方法(final),私有方法(private),构造方法都是由 invokespecial 指令来调用,属于静态绑定。普通的Public方法有可能出现方法重写的情况,因此再编译期间不能确定调用哪个对象的方法,可能是子类的、可能是父类的。

2023-01-12 15:45:38 382

原创 GC调优

GC频繁说明空间紧张,若是新生代的空间紧张,当业务高峰期时大量对象被创建将新生代的空间很快占满,这时幸存区空间紧张使对象晋升预值降低,导致很多本来生存周期很短的对象也会被晋升到老年代,进一步触发老年代Full GC 的频繁发生。一次请求响应的过程以后其中大部分对象都会被回收,而只要一次请求+并发量占用的内存不超过新生代内存就不会触发或较少触发新生代的垃圾回收。调优参数在重新标记发生之前先对新生代的对象做一次垃圾清理,清理之后存活对象即可减少,此时重新标记时需要标记和查找的对象也随之减少。

2023-01-02 18:50:56 424

原创 G1垃圾回收

【E区幸存对象会被复制到Survive区中,另一些Survive区中不够年龄的也会复制其中,符合晋升条件的对象会放入老年代中】===>属于新生代垃圾回收(发生在混合收集阶段)● 超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域(每个区域差不多为1248M,每个区域都可以独立的作为伊甸园、幸存区、老年代)● 之前C未被引用,这时A引用了C,就会给C加一个写屏障,写屏障的指令会被执行,将C放入一个队列当中,并将C变为 处理中 状态。因为指定了最大停顿时间,如果对所有老年代都进行回收,耗时可能过高。

2023-01-01 12:23:47 881

原创 JVM——垃圾回收

当某个对象不再被其他的对象所引用时,会先将终结器引用对象放入引用队列中,然后根据终结器引用对象找到它所引用的对象,然后调用该对象的finalize方法。●扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收。当虚引用对象所引用的对象被回收以后,虚引用对象就会被放入引用队列中,调用虚引用的方法。所引用的对象被回收以后,会将这些引用放入引用队列中,方便一起回收这些软/弱引用对象。)时,在内存不足时,会回收软引用所引用的对象。)引用该对象时,在垃圾回收时,

2022-12-25 21:54:43 414 1

原创 JVM——常量池

常量池是.class文件中的,当该* 类被加载以后,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址 **,而创建ab的时候已经在串池中放入了“ab”,所以ab3直接从串池中获取值,所以进行的操作和 ab = “ab” 一致。常量池中的信息,都会被加载到运行时常量池中,但这是a b ab 仅是常量池中的符号,还没有成为java字符串。,只有当运行到那一行字符串且在串池中不存在的时候(如 ldc #2)时,该字符串才会被创建并放入串池中。的方法来创建新的字符串时,因为内容是变量,只能。

2022-12-19 22:33:55 304

原创 单词分析——KMP(Java)

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

2022-11-09 11:35:49 112

原创 String类常见构造方法大全(Java)

使用直接赋值的方式获取一个字符串对象。其字符串会存在串池(StringTable)中,也可理解为字符串常量池**,在JDK7版本开始,从方法取中挪到了堆内存中。

2022-11-08 15:12:48 2864 3

原创 分布式搜索———黑马旅游

1、修改RequestParams类(前端所传的数据),添加brand、city、starName、minPrice、maxPrice等参数。2、修改search方法的实现,在match查询基础上添加过滤条件,在关键字搜索时,在如果brand等参数存在,对其做过滤。3、修改search方法,添加function score功能,给isAD值为true的酒店增加权重。2、挑选几个你喜欢的酒店,给它的文档数据添加isAD字段,值为true。1、定义实体类,接收前端请求。成功显示数据且排序成功!

2022-11-05 15:02:05 760

原创 RestClient查询文档

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分,同样是利用QueryBuilders提供的方法。RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,其中包含了查询、排序、分页、高亮等所有功能。在查询时整体流程不变,变化的只有查询的方式,因此我们可以将不变的API进行抽取。返回结果结构 (解析结果———>参考JSON结果,选中要抽取的快捷键,使用。高亮的结果处理相对较麻烦。

2022-11-04 00:05:41 410 1

原创 DSL查询文档

例如按price排序后,获取from = 990,size =10的数据。当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。需求:搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店。:算分函数查询,可以控制文档相关性算分,根据新的到的算分排序进而控制文档排名,例如百度竞价。复合(compound)查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。:根据值的范围查询(可以是数值、日期的范围)

2022-11-02 22:52:50 1620 1

原创 RestClient Java客户端

ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。

2022-11-01 21:34:32 1182

原创 分布式搜索——Elasticsearch

elasticsearch是一款非常强大的开源分布式搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK:以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch)。被广泛应用在日志数据分析、实时监控等领域elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。

2022-10-31 16:05:54 728 4

原创 服务异步通讯——RabbitMQ

资源链接提取码:GY66RabbitMQ的结构和概念RabbitMQ中的几个概念● Publisher:消息发送者● consumer:消息消费者● channel:操作MQ的工具● exchange:交换机,路由消息到队列中● queue:队列,缓存消息● virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组。

2022-10-30 17:01:20 1902 1

原创 DockerCompose部署微服务集群失败[41708] Cannot open self /usr/local/bin/docker-comp

查找原因发现可能是由于网络原因下载不完整,只好去Github官网手动下载然后上传至 /usr/local/bin/ 目录下再次部署。于是尝试换种方式使用命令由Github拉取下载安装至 /usr/local/bin/ 目录下再次部署会出现下载完全卡住现象。2、下载DockerCompose至 /usr/local/bin/ 目录下。命令部署微服务集群出现报错 (采用curl安装方式)此时DockerCompose安装成功。此时发现下载不完整导致完全卡住的现象。

2022-10-28 15:09:26 588 1

原创 会话跟踪技术(Cookie、Session)

用户打开浏览器,访问Web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应: 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一服务器,以便在同一次会话的多次请求间共享数据。

2022-10-22 19:44:32 974 1

原创 快速解决端口号被占用

4、可以发现8080端口号被服务nginx.exe占用,于是我们输入命令。2、假设想要查找被占用的端口号为8080,在弹出的命令窗口输入命令。终止该服务后台运行,这样即可解决8080端口占用的情况!1、使用Win+R命弹出窗口,键入。3、此时可观察到8080端口号被。进程占用,于是我们输入新的命令。查看8080端口被哪些程序占用。

2022-10-20 16:24:14 1706

空空如也

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

TA关注的人

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