![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 66
studyday1
多总结,多思考,多批判,多学习
展开
-
【Java 泛型】java泛型‘T‘与‘?‘区别
可以表示成占位符,它自己也不知道list集合中会存放多少种类型的数据,所以这样就表明我们的list中存放N种数据类型也是可以的。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。示例:可以看到show1方法中我们使用了T,大家都知道这是泛型的常见写法,那么这里的T指的是某一类具体的对象,list集合里只能存放同一类型数据,如果插入不同类型数据则会报错。结论:'T'指的是某一类具体的对象,'?原创 2024-04-29 15:03:32 · 420 阅读 · 1 评论 -
【业务功能篇151】Springboot中接口传递时间格式问题 @JsonFormat与@DateTimeFormat注解的使用
我这里就只贴这两个属性了,这里我两个注解都同时使用了,因为我既需要取数据到前台,也需要前台数据传到后台,都需要进行时间格式的转换,可以同时使用。3.完成上面两步之后,我们用对应的实体类来接收数据库查询出来的结果时就完成了时间格式的转换,再返回给前端时就是一个符合我们设置的时间格式了。提示:@JsonFormat注解可以在属性的上方,同样可以在属性对应的get方法上,两种方式没有区别。2.在你需要查询出来的时间的数据库字段对应的实体类的属性上添加@JsonFormat。1.注解@JsonFormat。原创 2024-04-25 11:09:12 · 1208 阅读 · 0 评论 -
【git仓问题】idea中处理 fork远端仓代码提交及更新
其实就是平常我们需要开发中,当要push代码时,是需要先进行pull获取当前项目的最新状态的,一般就是自己本地开发个人分支,然后推送到dev分支,团队中都是推送到dev分支上,所以多人协作时,就需要在push之前,要pull下来当前的最新代码,有新增代码本地就会合并,再进行push。项目中,一般我们都是直接在git远程仓库A上直接创建分支进行开发,还有另外一种模式,就是通过fork方式,将项目远程仓库A fork到自己的远程代码仓B中上,然后这个代码仓B才是作为我们的远端仓。原创 2024-04-23 15:02:59 · 716 阅读 · 0 评论 -
【多线程】interrupt volatile 优雅关闭线程
如何优雅的停止一个线程?_如何优雅的关闭线程-CSDN博客原创 2024-03-26 11:14:37 · 237 阅读 · 1 评论 -
【jvm】young gc full gc
何时触发YoungGC或FullGCYoungGC的触发时常在发生,当新生代的Eden区满了之后就会触发YoungGC。FullGC在多个情况下都会被触发:1、发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC2、当老年代没有足够空间存放对象时,会触发一次FullGC。原创 2024-03-24 11:20:58 · 830 阅读 · 0 评论 -
【业务功能篇 150】Java8 Time时间优化 解决线程不安全
比如多线程任务执行业务逻辑中存在时间字段的格式处理,出错的概率低,这个主要是因为业务并发量问题,大多数并发小,一旦大起来,那就会导致当前线程取得时间,是其他线程设置了的时间,时间覆盖错乱,因为其底层是final修饰,共享变量且没有做线程安全控制锁之类的;但这样的方式终究不是最好的,所以我们使用 ThreadLocal ,来优化这段代码。优化方式二:(Java8里的 java.time.format.DateTimeFormatter是线程安全的, time里的DateTimeFormat也是线程安全的)。原创 2024-03-16 21:30:24 · 639 阅读 · 0 评论 -
AtomicInteger 使用
为什么AtomicInteger 对象在 Stream 中被视为不可变的最终变量_stream atomic的作用-CSDN博客AtomicInteger详解-CSDN博客原创 2024-03-16 15:40:20 · 301 阅读 · 0 评论 -
【业务功能篇 147】OOM场景示例、解决方案、ArrayList内存溢出、软引用
【业务功能篇136】MAT(Memory Analyzer Tool),找出导致OOM的代码-CSDN博客为什么我使用【ArrayList】存储数据报错【OOM】_"arraylist login=(arraylist)session.getattribute(\-CSDN博客 Java内存溢出如何解决,Java oom排查方法,10个定位解决办法_javaoom怎么解决-CSDN博客原创 2024-03-16 01:53:54 · 314 阅读 · 0 评论 -
SQL优化到业务层优化整体思路
多表联查优化_sql 多表关联优化-CSDN博客原创 2024-03-15 20:20:54 · 179 阅读 · 0 评论 -
【业务功能篇 146】Sping之RestTemplate http请求封装+配置类
Service层进行调用 第三方请求接口。原创 2024-03-15 16:11:18 · 560 阅读 · 0 评论 -
【业务功能篇145】Spring项目中线程池实战应用各种场景ThreadPoolTaskExecutor
【业务功能篇 142】多线程池+Semaphore信号量 数据并行处理-CSDN博客 【业务功能篇135】多线程+countDownLatch执行大数据量定时任务_countdownlantch 实现多个线程开始执行任务的最大并行性-CSDN博客 线程池ThreadPoolTaskExecutor实战-CSDN博客springboot线程池ThreadPoolTaskExecutor使用_threadpooltaskexecutor springboot-CSDN博客原创 2024-03-15 11:38:17 · 529 阅读 · 0 评论 -
Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask
解述Java多线程之Executor、ExecutorService、Executors、Callable、Future与FutureTask_taskexecutor.submit futuretask-CSDN博客原创 2024-03-15 11:03:23 · 527 阅读 · 0 评论 -
Java中的Object、T(泛型)、?区别
这个可能在用到反射需要获取Class类型时用到,它的解释就是:接收一个不确定的类型,有点和Object一样。"有比Object稍微“高级”有点的用法,就是它能缩小一个不确定的范围,利用类似"?这个要怎么来理解呢?我的理解是,可以抛开这个为了创造容器类这个,而是回到泛型的目的是。List本身是个泛型类,现在我们指定它接收Object类型的参数,此时就可以放置任意类型的参数进去,而在取出来是就必须得进行强制类型转换成具体的类型。这点给我们带来的启示是,在编写类似List类的时候,一定要注意是否用泛型。原创 2024-03-15 10:35:10 · 567 阅读 · 0 评论 -
【业务功能篇 143】Spring容器中的ThreadPoolTaskExecutor多线程,LinkedBlockingQueue问题
【代码】【业务功能篇 143】Spring容器中的ThreadPoolTaskExecutor多线程,LinkedBlockingQueue问题。原创 2024-03-14 16:51:47 · 222 阅读 · 0 评论 -
【业务功能篇 142】多线程池+Semaphore信号量 数据并行处理
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。原创 2024-03-14 16:11:19 · 878 阅读 · 0 评论 -
【多线程】OOM问题
编码踩坑——多线程可能带来意想不到的OOM_多线程oom-CSDN博客原创 2024-03-14 14:35:12 · 498 阅读 · 0 评论 -
【业务功能篇】多环境配置、多数据源切换失效@DS解决方式
3.什么情况下@DS会失效?在同一个实现类中,一个非DS注解的常规方法里调用@DS注解的方法,同样存在@DS失效的情况,原因同2,是由spring的aop机制导致的,如果确有这种业务需要,可以将该DS注解方法定义在不同的类中,通过bean注入的方式调用,就不会出现这个问题。在事务方法内调用@DS注解的方法,@DS注解同样不生效,原因是spring只能拦截到最外层方法的@Transactional注解,此时加载该事务的数据源,在事务方法内即使调用了@DS注解的方法,获取的是外层事务的数据源,导致@DS失效。原创 2024-03-14 11:00:47 · 1028 阅读 · 0 评论 -
Lock锁的过程不要写在try中
获取锁的过程不要写在try中,避免获取锁失败最后finally释放其他线程持有的锁。原创 2024-03-12 12:22:19 · 252 阅读 · 0 评论 -
【业务功能篇140】ConcurrentHashMap缓存用户信息
ConcurrentHashMap的简要总结:1、public V get(Object key)不涉及到锁,也就是说获得对象时没有使用锁;2、put、remove方法要使用锁,但并不一定有锁争用,原因在于ConcurrentHashMap将缓存的变量分到多个Segment,每个Segment上有一个锁,只要多个线程访问的不是一个Segment就没有锁争用,就没有堵塞,各线程用各自的锁,ConcurrentHashMap缺省情况下生成16个Segment,也就是允许16个线程并发的更新而尽量没有锁争用。原创 2024-03-12 09:48:43 · 479 阅读 · 0 评论 -
Spring中什么样的Bean存在线程安全问题-有状态bean
在Spring容器中,除了很多Spring内置的Bean以外,其他的Bean都是我们自己通过Spring配置来声明的,然后,由Spring容器统一加载。基于对以上Spring Bean作用域的理解,下面,我们来分析一下在Spring容器中,什么样的Bean会存在线程安全问题。(是否延时加载)等。所以,可想而知,无状态的单例Bean是不存在线程安全问题的。但是,在多线程操作中如果需要对Bean中的成员变量进行数据更新操作,这样的Bean称之为有状态Bean,所以,有状态的单例Bean就可能存在线程安全问题。原创 2024-03-11 16:18:01 · 391 阅读 · 0 评论 -
【业务功能篇139】@Autowired和实现ApplicationContextAware获取容器bean的区别
Autowire。原创 2024-03-11 15:34:27 · 891 阅读 · 0 评论 -
git IDEA的分支合并时的冲突问题总结,merge和rebase的区别
git IDEA的分支合并时的冲突问题总结,merge和rebase的区别_the merge branch should be-CSDN博客原创 2024-03-11 12:26:50 · 419 阅读 · 0 评论 -
synchronized 锁的升级
从无锁到重量级锁,锁的粒度在不断加大,而且锁的升级过程是不可逆的。有大量的线程此时都要获取锁,由于锁的竞争非常激烈,如果还是不断通过自旋的方式的话,CPU会出现空转的情况,会大量消耗性能,所以轻量级锁就会升级为重量级锁,此时就是操作系统层面来操作了,通过Mutex Lock互斥量,来决定哪个线程获取到锁。线程进入同步方法获取到偏向锁后,此时又有别的线程也要进来,他们通过自旋的方式,来回获取锁然后执行,此时趋于一种相对平稳的状态,就升级为了轻量级锁,他们不会被阻塞,而是通过自旋的方式去不断获取并执行。原创 2024-03-11 01:11:09 · 233 阅读 · 0 评论 -
【业务功能篇138】SpringBoot中的事务传播属性运用REQUIRED、REQUIRES_NEW、NESTED 只读属性运用readOnly
假如当前正要运行的事务不在另外一个事务里,那么就起一个新的事务 比方说,ServiceB.methodB的事务级别定义PROPAGATION_REQUIRED, 那么因为执行ServiceA.methodA的时候,ServiceA.methodA已经起了事务。此外,只读事务不能保证数据的一致性,因为在只读事务中,数据可能已经被其他事务修改了,因此在使用只读事务时需要注意这一点。此外,只读事务不能保证数据的一致性,因为在只读事务中,数据可能已经被其他事务修改了,因此在使用只读事务时需要注意这一点。原创 2024-03-10 11:52:30 · 1144 阅读 · 0 评论 -
Java8 新特性
https://www.cnblogs.com/huigui-mint/p/17478645.html原创 2024-03-10 00:11:47 · 144 阅读 · 0 评论 -
【业务功能篇137】Java8特性:Optional
实际开发中会遇到一个大对象,链式的处理数据,并且还不确定是否为空,如果是简单的对象嵌套判断可以直接就 == null, 但是如果还有一系列的逻辑处理,那么新特性Optional一定能更优雅简洁的实现。原创 2024-03-09 12:20:38 · 892 阅读 · 0 评论 -
【jvm】java对象占用内存问题深入解析
一个Java对象占用多大内存-CSDN博客关于Object o = new Object()追魂九连问(个人学习笔记) - 知乎原创 2024-03-07 16:51:34 · 415 阅读 · 0 评论 -
【业务功能篇136】MAT(Memory Analyzer Tool),找出导致OOM的代码
(2)-XX:HeapDumpPath=目 录 参 数 表 示 生 成 D U M P 文 件 的 路 径 , 也 可 以 指 定 文 件 名 称 , 例 如 : − X X : H e a p D u m p P a t h = {目录}参数表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=目录参数表示生成DUMP文件的路径,也可以指定文件名称,例如:−XX:HeapDumpPath={目录}/java_heapdump.hprof。原创 2024-02-27 16:43:20 · 856 阅读 · 0 评论 -
【业务功能篇134】Mysql 连接池HikariCP配置
其中,connection-timeout是连接超时时间,idle-timeout是空闲连接池的超时时间,pool-size是连接池的大小,minimum-idle是连接池中最小的空闲连接数,maximum-pool-size是连接池中最大的连接数,transaction-isolation是事务隔离级别。这意味着在同一时间点,最多可以有10个连接可供使用。其中,url是数据库连接的URL,username和password是登录数据库的用户名和密码,driver-class-name是数据库驱动的类名。原创 2024-01-24 20:10:03 · 939 阅读 · 0 评论 -
【业务功能篇133】 Mysql连接串优化性能问题
可以获得许多优点,从而提高数据库插入性能、减轻负载以及简化代码。MyBatis Plus框架自带的批处理方法 可以直接调用使用,但是要注意mysql连接串要配置参数为true 否则这个性能还是不会起来。1.可以在sql语句后携带分号,实现多语句执行。是一种高效的数据库操作方式。原创 2024-01-24 20:05:50 · 477 阅读 · 0 评论 -
【业务功能篇132】生产环境中出现oom问题,排查思路
给大家还是举个例子吧,我们线上系统的一个真实例子,大家可以用这个例子在面试里来说,比如说当时我们有个系统,在后台运行,每次都会一下子从mysql里加载几十万行数据进来各种处理,类似于定时批量处理,这个时候,如果对几十万数据的处理比较慢,就会导致比如几分钟里面,大量数据囤积在老年代,然后没法回收,就会频繁full gc。代码进行优化、根据压测的情况去进行一定的jvm参数的调优,一个系统的QPS,一个是系统的接口的性能,压测到一定程度的时候 ,机器的cpu、内存、io、磁盘的一些负载情况,jvm的表现。原创 2023-12-15 11:17:38 · 1306 阅读 · 1 评论 -
【测试功能篇 01】Jmeter 压测接口最大并发量、吞吐量、TPS
压力测试,我们针对比较关键的接口,可以进行相应的压力测试,主要还是测试看看接口能抗住多少的请求数,TPS稳定在多少,也就是吞吐量多少。原创 2023-11-17 18:03:17 · 11258 阅读 · 1 评论 -
【中间件篇-Redis缓存数据库08】Redis设计、实现、redisobject对象设计、多线程、缓存淘汰算法
type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。每种数据结构都有两种以上的内部编码实现,例如list数据结构包含了linkedlist和ziplist两种内部编码。原创 2023-11-13 17:46:50 · 1153 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库07】Redis缓存使用问题及互联网运用
bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。bigkey无论是空间复杂度和时间复杂度都不太友好,下面我们将介绍它的危害。原创 2023-11-13 17:02:48 · 881 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库06】Redis主从复制/哨兵 高并发高可用
在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis 副本。复制功能是高可用Redis的基础,后面章节的哨兵和集群都是在复制的基础上实现高可用的。默认情况下,Redis都是主节点。每个从节点只能有一个主节点,而主节点可以同时具有多个从节点。复制的数据流是单向的,只能由主节点复制到从节点。原创 2023-11-13 14:29:11 · 746 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库05】Redis集群高可用高并发
Redis集群中,在握手成功后,每个节点之间会定期发送ping/pong消息,交换数据信息,集群中节点数量越多,消息体内容越大,比如说10个节点的状态信息约1kb,同时redis集群内节点,每秒都在发ping消息。如下图所示,三个节点真实节点:Node1、Node2和Node3,每个真实节点虚拟出三个虚拟节点:X#V1、X#V2和X#V3,这样每个真实节点所负责的hash空间不再是连续的一段,而是分散在环上的各处,这样就可以将局部的压力均衡到不同的节点,虚拟节点越多,分散性越好,理论上负载就越倾向均匀。原创 2023-11-12 10:38:06 · 684 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库04】Redis底层原理持久化、分布式锁
Redlock 只有建立在「时钟正确」的前提下,才能正常工作,如果你可以保证这个前提,那么可以拿来使用。但是时钟偏移在现实中是存在的:第一,从硬件角度来说,时钟发生偏移是时有发生,无法避免。例如,CPU 温度、机器负载、芯片材料都是有可能导致时钟发生偏移的。第二,人为错误也是很难完全避免的。所以,Redlock尽量不用它,而且它的性能不如单机版 Redis,部署成本也高,优先考虑使用主从+ 哨兵的模式实现分布式锁(只会有很小的记录发生主从切换时的锁丢失问题)。原创 2023-11-11 15:40:16 · 790 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库03】Redis高级特性和应用(发布 订阅、Stream)
足够简单,消费消息延迟几乎为零,但是需要处理空闲连接的问题。如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常,还有重试。其他缺点包括:做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认;不能做广播模式,如pub/sub,消息发布/订阅模型;原创 2023-11-10 17:00:45 · 1446 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库01】Redis安装、命令、常用数据结构String|Hash|list|set|zset、高级数据结构Bitmaps|HyperLogLog|Geo
1970 年布隆提出了一种布隆过滤器的算法,用来判断一个元素是否在一个集合中。这种算法由一个二进制数组和一个 Hash 算法组成。本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。原创 2023-11-10 14:57:14 · 192 阅读 · 0 评论 -
【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)
先有一个桶,桶的容量是固定的。以任意速率向桶流入水滴,如果桶满了则溢出(被丢弃)。桶底下有个洞,按照固定的速率从桶中流出水滴。原创 2023-11-09 20:27:30 · 1186 阅读 · 0 评论